基于角色的访问控制(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’]的值