权限管理

    Acl类依赖的数据表如下,请复制到mysql中执行。 语句中的pr_为表前缀,请自行替换在实际的表前缀。

    数据表说明

    • pr_admin_group为用户组表

    用来存储用户组相关信息。

    • pr_admin_users为用户信息表

    用来存储用户相关信息。一个用户可能属于多个用户组,比如某个用户同时属于id为 1、3的用户组。则用户表中的groupid字段存储的数据则为 1|3。多个组id以|分隔

    • pr_admin_menu为菜单表

    用来存储菜单相关信息。数据格式类似
    url字段为访问的操作的地址

    • pr_admin_access为权限关系表

    用来存储权限相关信息。

    修改配置

    在配置文件中加入如下配置:'administratorid'=> 1, //超管理员id

    • 保存登录信息

    1. <?php
    2. use Cml\Vendor\Acl;
    3. //判断用户名密码....登录是否成功
    4. Acl::setEncryptKey('ffddsff');//配置加密key 这个最好在共公控制器的init方法/__construct方法里设置
    5. Acl::setLoginStatus($user['id']); //设置某用户为登录判断
    • 判断用户是否已登录以及是否有权限

    • 获取当前登录用户有权限的菜单

    1. <?php
    2. use Cml\Vendor\Acl;
    3. $menus = Acl::getMenus();//包含用户自有的权限、以及其所在用户组所拥有的权限
    • 登出

    • 判断当前用户是否是超级管理员

    1. <?php
    2. use Cml\Vendor\Acl;
    3. $isSuperUser = Acl::isSuperUser();
    • 自定义表名

    如果想要自定义表名可以如下操作:

    Acl::setTableName([
    'access' => 'admin_access',
    'groups' => 'admin_groups',
    'menus' => 'admin_menus',
    'users' => 'admin_users',
    ]);

    app

    特殊说明

    通常情况我们会建一个共用的控制器。在共用控制器的init方法或__construct方法里,验证用户是否登录以及是否拥有当前模块的访问权限。这时是所有对外的方法都会被验证。但是在实际项目中我们往往会想要跳过一些方法的权限校验,比如:

    • 对方法注释 则不检查该方法的权限

    比如有一个方法resume.想要跳过权限检查则注释如下即可

    /**

    • 恢复微博
    • @noacl
      /
      public function resume()
    • 对方法注释 web/User/add 则将当前方法的权限检查跳转为检查 web/User/add方法的权限

    比如上面说的 user/save权限只要判断有无user/add或user/edit的权限就好了。

    /**

    • 保存用户信息
    • @acljump user/add|user/edit
      /
      public function save()

    参考相关章节

    示例