权限管理

权限配置

理论上,菜单配置就是权限配置,权限我们采用的是自己开发的Auth权限,并且我们实现了私有权限公有权限的管理

其次你的菜单的地址例如:/system/Category/index 他的类型为菜单形式、用于展示的菜单,请勿设置类型错误

我们这里的权限分为Admin应用权限和Index应用权限,需要注意的是Index并未实现菜单权限;如果有需要可以利用扩展类自行实现

后端鉴权

swiftadmin 框架后端鉴权采用经典的auth权限鉴定方案,之所以选择这个方案是因为这个方案足以应付大多数情况下的基本鉴权操作!

在基类中我们有定义以下两个属性

protected $noNeedAuth = []; // 非鉴权的方法,也就不需要登录
// 请注意,这里的控制器并未转换成小写
// 因为在Linux下大小写敏感 所以在添加的时候,请严格按照文件名添加
// 例如我的控制为User,填写/user/index为首页。如果控制器为UserGroup 则菜单填写/userGroup/index为首页
$this->controller = request()->controller();
$this->action = request()->action(true);
$this->method = '/' . strtolower($this->controller) . '/' . $this->action;

// 校验权限
$this->auth = Auth::instance();
if (!in_array($this->method, $this->noNeedAuth)
    && !in_array('*', $this->noNeedAuth)) {
    if (!$this->auth->SuperAdmin() && !$this->auth->check($this->method, $this->admin['id'])) {
        if (request()->isAjax()) {
            return $this->error('没有权限!');
        } else {
            $this->throwError('没有权限!', 401);
        }
    }
}

如果你需要更详细的鉴权操作,则需要自己进行代码的部分逻辑重构!后端鉴权默认会在基础控制器进行权限鉴定操作,如果没有权限则会返回
JSON格式信息或抛出一个403权限异常页面!

前端鉴权

SwiftAdmin 前端使用JS判断路由节点进行鉴权,在用户登录后会从后端请求菜单项以及权限节点,

在用户点击编辑或者执行ajax操作的时候,会首先在前端进行递归匹配权限,如果没有匹配到,则交由PHP后端去处理权限的校验

一般会从form表单的action 或者属性值的data-url lay-add lay-edit去查找地址。你可以参考以下伪代码来实现自己的鉴权函数

if (!function_exists('check_auth')) {
  /**
   * 权限判断
   */
  function check_auth($urls, $action = '', $attr = 'data-url') {

    $judge = false;
    $urls = (string)url($urls);
    $urls = str_replace('.html','',$urls);
    if (preg_match('/\/\w+.php(\/.*?\/.*?\w+[^\/\?]+)/',$urls, $macth)) {
      $judge = app\common\library\auth::instance()->checkAuth($macth[1]);
    }
    echo !$judge ? 'lay-noauth' : $attr .'="'.$urls.'"' . $action;
  }
}

当然你也可以实现一个函数,但是通常这没有多大必要!!!

<a href="javascript:;" {:youfunction('/system/Admin/add','lay-open')} >用来鉴权</a>

也就是说,在前端页面,如果你不期望用户看到后端的访问地址,则可以使用这样的方式来对前端的按钮进行鉴权操作。 如果对方没有权限的情况下,则会输出lay-noauth属性,JS会监听这个属性的点击,如果有权限的话则会输出 data-url="/admin.php/system.admin/add" lay-open

最后更新时间:2022-08-21 18:25:241748
https://doc.swiftadmin.net/help/9.html