ThinkPHP的RBAC

基于角色的访问控制(Role-Based Access Control)node

在RBAC中,权限与角色相关联,用户经过成为适当角色的成员而获得这些角色的权限。数据库

ThinkPHP经过5张表实现权限控制数组

  think_user (用户表)app

  think_role (用户分组表)加密

  think_node (操做节点)spa

  think_role_user (用户和用户分组的对应)3d

  think_access (各个操做和用户组的对应)调试

认证过程code

1.判断当前模块的当前操做是否须要认证
2.若是须要认证而且还没有登陆,跳到认证网关,若是已经登陆 执行5
3.经过委托认证进行用户身份认证
4.获取用户的决策访问列表
5.判断当前用户是否具备访问权限

 

配置config文件blog

array(
        'APP_AUTOLOAD_PATH'=>'@.TagLib',
        'SESSION_AUTO_START'     =>true,
        'USER_AUTH_ON'              =>true,
        'USER_AUTH_TYPE'            =>1,        // 默认认证类型 1 登陆认证 2 实时认证
        'USER_AUTH_KEY'             =>'authId',    // 用户认证SESSION标记
        'ADMIN_AUTH_KEY'            =>'administrator',
        'USER_AUTH_MODEL'           =>'User',    // 默认验证数据表模型
        'AUTH_PWD_ENCODER'          =>'md5',    // 用户认证密码加密方式
        'USER_AUTH_GATEWAY'         =>'/Public/login',// 默认认证网关
        'NOT_AUTH_MODULE'           =>'Public',    // 默认无需认证模块
        'REQUIRE_AUTH_MODULE'       =>'',        // 默认须要认证模块
        'NOT_AUTH_ACTION'           =>'',        // 默认无需认证操做
        'REQUIRE_AUTH_ACTION'       =>'',        // 默认须要认证操做
        'GUEST_AUTH_ON'             =>false,    // 是否开启游客受权访问
        'GUEST_AUTH_ID'             =>0,        // 游客的用户ID
        'DB_LIKE_FIELDS'            =>'title|remark',
        'RBAC_ROLE_TABLE'           =>'think_role',
        'RBAC_USER_TABLE'           =>'think_role_user',
        'RBAC_ACCESS_TABLE'         =>'think_access',
        'RBAC_NODE_TABLE'           =>'think_node',
        'SHOW_PAGE_TRACE'       =>1      //显示调试信息
    );

  注:

    Public模块是无需认证的

    默认网关地址就是认证失败,没有权限跳转到此处,从新登录

    ADMIN_AUTH_KEY表示超级管理员权限,不用分配权限,它什么权限都有

重要的方法:

  authenticate($map,$model=”)  传入查询用户的条件和用户表的MODEL 返回数组包含用户的信息

  saveAccessList($authId=null)  传入用户的ID,无返回值,只是设置 $_SESSION[‘_ACCESS_LIST’]的值

  checkAccess()  检测当前模块和操做是否须要验证

  checkLogin()   检测登陆

  AccessDecision($appName=APP_NAME)  检测当前项目模块操做 是否在$_SESSION[‘_ACCESS_LIST’]数组中

        $_SESSION[‘_ACCESS_LIST’][‘当前操做’][‘当前模块’][‘当前操做’]是否存在,存在,表示有权限

  getAccessList($authId)  经过查询数据库 返回权限列表,$_SESSION[‘_ACCESS_LIST’]的值

相关文章
相关标签/搜索