今天晚上把ThinkPHP的权限分配弄明白了,内心的包袱马上放下了,感受那个爽啊!稍微记录一下。php
背景:CMS系统开发(17do)。html
项目分组:Admin(后台管理)、Home(前台显示)。
Admin组中包含ManagerAction、UserActin、ArticleAction三个控制器node
第一部分:表关系对应(箭头是指数据来源)数据库
定义结果:站长1能访问项目用户和文章的全部操做,管理员3只能对文章模块操做不能访问用户模块。session
第二部分:项目配置
项目的config.php文件中添加函数
//权限分配设置
'USER_AUTH_ON'=>true, //是否须要认证
'USER_AUTH_TYPE'=>1, //认证类型
'USER_AUTH_KEY'=>'userId', // 认证识别号
'USER_AUTH_MODEL'=>'user',//模型实例(用户表名)
'REQUIRE_AUTH_MODULE'=>'User', //须要认证模块
'NOT_AUTH_MODULE'=>'', //无需认证模块
'USER_AUTH_GATEWAY'=>'/Public/login', //认证网关
//RBAC_DB_DSN 数据库链接DSN
'RBAC_ROLE_TABLE'=>'do_role', //角色表名称
'RBAC_USER_TABLE'=>'do_role_user', //用户和角色对应关系表名称
'RBAC_ACCESS_TABLE'=>'do_access', //权限分配表名称
'RBAC_NODE_TABLE'=>'do_node', // 权限表名称post
第三部分:权限信息写入控制器this
public function checkUser(){
//表单数据不能为空
if($this->_post('username')&&$this->_post('password')&&$this->_post('verifycode')){
$pwd= $this->_post('password');
$username= $this->_post('username');
//验证码是否正确
$verify= $this->_post('verifycode');
if($this->_session('verify')!= md5($verify)){
$this->error("验证码错误");
}else{
//建立数据库对象
$user=M('user');
//根据用户名查询
$cond['username']=$username;
$cond['active']=array('gt',0);
//加载RBAC类
import('ORG.Util.RBAC');
//经过authenticate读取用户信息
$result=RBAC::authenticate($cond);
//dump($result);
if($result){
if($result['password']==md5($pwd)){
$_SESSION[C('USER_AUTH_KEY')]=$result['id'];
$_SESSION["name"]=$result['name'];
//使用saveAccessList缓存访问权限
RBAC::saveAccessList();
$this->display('Manager:index');
}else{
$this->error("用户密码错误");
}
}else{
$this->error("用户名不存在或已经被禁用");
}url
}
第四部分:建立验证权限控制器
class CommonAction extends Action{
//_initialize()方法是ThinkPHP提供的入口方法,相似于原PHP中__condition()构造函数。能够存放全部公用信息。
function _initialize(){
//判断是否开启认证,而且当前模块须要验证
if(C('USER_AUTH_ON')&&!in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))){
//导入RBAC类,开始验证
import('ORG.Util.RBAC');
//经过accessDecision获取权限信息
if(!RBAC::AccessDecision()){
//没有获取到权限信息时须要执行的代码
//一、用户没有登陆
if(!$_SESSION[C('USER_AUTH_KEY')]){
$url= U('Public/login');
$this->error("您尚未登陆不能访问",$url);
}
$this->error("您没有操做权限");
}
}
}
}
第五部分:验证控制器调用
只要须要权限验证的控制器继承CommonAction就能够啦!
使用admin帐号登录能正常访问