您现在的位置是:网站首页 > 脚本编程>
Thinkphp 基于角色的访问控制(rbac)
最近在用Thinkphp写个后台管理系统,总是在用户权限这块纠结,在学校的时候听说过rbac(基于角色的访问控制)但是由于本人比较笨,当时没有听明白。好了不再啰嗦了下面就是rbac的学习过程给大家贴一下。
在rbac中只用到了5张表分别是:think_access,think_node,think_role,think_role_user,think_user。其中红色部分为thinkphp中自带的表在Thinkphp-->extend-->library-->org-->util-->RBAC.class.php中38----79行。将其复制到数据库中执行。但是在think_access在添加一个字段 pid。think_user是自己创建的。
think_access:是用户组访问权限表(节点和用户组关联表)
think_node:节点表
think_role:用户组表
think_role_user:用户组和用户关联表
think_user:用户表
think_access 表字段解释
role_id:用户组id node_id:节点id level:节点表中的level module: pid:节点表中的pid think_node 表字段解释 id: id自增这个并不用解释 name:名称(必填) title: 标题(可为空) status: 状态 为1 开启状态 0关闭状态 remark:标签(备注)可为空 sort:排序用的 pid:如果是项目名称 就填写0,如果是模块就填写项目的 id ,如果是方法 就填写模块的 id level:如果是项目就填写1 如果是模块就填写 2 如果是方法就填写 3
节点(项目 1,模块 2,方法 3)之间的关系,你先得让用户能访问项目,模块,方法
(他们之间的关系,我们就叫做节点,如果说你需要将所有的节点全部可控制,
你就需要将所有的项目,项目下的模块,模块下的方法,全部加入到节点表当中去)
think_role 表字段解释
id:id自增 name:用户组的名称 pid:父id staus: 状态 为1 开启 0为关闭 remark: 备注 think_role_user 表字段解释 role_id:用户组id user_id:用户id
下面我们讲解代码部分
CommonAction.class.php 这个是初始化rbac的文件(注意这个文件继承Action)
代码如下:
//初使接口 class CommonAction extends Action{ function _initialize() { // 用户权限检查 if (C ( 'USER_AUTH_ON' ) && !in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE')))) { import ( 'ORG.Util.RBAC' ); if (! RBAC::AccessDecision ()) { //检查认证识别号 if (! $_SESSION [C ( 'USER_AUTH_KEY' )]) { //跳转到认证网关 redirect ( PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) ); } // 没有权限 抛出错误 if (C ( 'RBAC_ERROR_PAGE' )) { // 定义权限错误页面 redirect ( C ( 'RBAC_ERROR_PAGE' ) ); } else { if (C ( 'GUEST_AUTH_ON' )) { $this->assign ( 'jumpUrl', PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) ); } // 提示错误信息 $this->error ( L ( '_VALID_ACCESS_' ) ); } } } } } ?>
其他的控制都集成CommonAction
例如:
class ArticleAction extends CommonAction { function index() { $this->display(); } }
接下来在项目的配置文件中写入:
$arr=array( '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 'RBAC_ROLE_TABLE'=>'think_role', 'RBAC_USER_TABLE' => 'think_role_user', 'RBAC_ACCESS_TABLE' => 'think_access', 'RBAC_NODE_TABLE' => 'think_node', ); $arr1=include './config.inc.php'; return array_merge($arr1,$arr);
接下来我们设置public控制器
class PublicAction extends Action { public function index() { $this->login(); } public function login() { $this->display(); } public function checklogin() { if(empty($_POST['username'])) { $this->error('帐号错误!'); }elseif (empty($_POST['password'])){ $this->error('密码必须!'); } //生成认证条件 $map=array(); // 支持使用绑定帐号登录 $map['username'] = $_POST['username']; import ( 'ORG.Util.RBAC' ); $authInfo = RBAC::authenticate($map); //使用用户名、密码和状态的方式进行认证 if(false === $authInfo) { $this->error('帐号不存在或已禁用!'); }else { if($authInfo['password'] != md5($_POST['password'])) { $this->error('密码错误!'); } $_SESSION[C('USER_AUTH_KEY')] = $authInfo['id']; if($authInfo['username']=='admin') { $_SESSION['administrator'] = true; } $_SESSION['username'] = $authInfo['account']; // 缓存访问权限 RBAC::saveAccessList(); $url=U('/index/index'); $this->success('登录成功',$url); } } public function loginout() { if(isset($_SESSION[C('USER_AUTH_KEY')])) { unset($_SESSION[C('USER_AUTH_KEY')]); unset($_SESSION); session_destroy(); $this->assign("jumpUrl",/admin.php/Article.'/login/'); $this->success('登出成功!'); }else { $this->error('已经登出!'); } } public function verify() { import("ORG.Util.Image"); Image::buildImageVerify(); } }
打赏本站,你说多少就多少

本文地址:https://www.qi522.com/view/1.html
来 源:千奇博客
上一篇:没有了哦
下一篇:根据IP地址获取访问者所在的城市