今天晚上把ThinkPHP的权限分配弄明白了,心里的包袱立刻放下了,感觉那个爽啊!稍微记录一下。

背景:CMS系统开发(17do)。

项目分组:Admin(后台管理)、Home(前台显示)。
Admin组中包含ManagerAction、UserActin、ArticleAction三个控制器

第一部分:表关系对应(箭头是指数据来源)


其中表结构式根据RBAC规定的结构创建的。

定义结果:站长1能访问项目用户和文章的所有操作,管理员3只能对文章模块操作不能访问用户模块。

第二部分:项目配置
项目的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',  // 权限表名称

第三部分:权限信息写入控制器

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("用户名不存在或已经被禁用");
               
}

}

第四部分:创建验证权限控制器

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()){
               
//没有获取到权限信息时需要执行的代码
               
//1、用户没有登录
               
if(!$_SESSION[C('USER_AUTH_KEY')]){
                   
$url= U('Public/login');
                   
$this->error("您还没有登录不能访问",$url);
               
}
               
$this->error("您没有操作权限");
           
}
       
}
    }
}

第五部分:验证控制器调用

只要需要权限验证的控制器继承CommonAction就可以啦!

使用admin账号登陆能正常访问


使用xiaoxiao账号登陆后不能访问用户列表页面

最新文章

  1. 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
  2. Python 类(一)
  3. Postgres 9.4 feature highlight: REPLICA IDENTITY and logical replication
  4. hihocoder 1154 Spring Outing
  5. LA 3211
  6. CMD下查看某个端口被谁占用了
  7. python 列表(list)去除重复的元素总结
  8. oracle,wamp,FZ突然出现问题,求解决方案(未解决,最终系统还原)
  9. Stanford Parser学习入门(2)-命令行运行
  10. C# 引用SHDocVw 实现模拟网页操作
  11. Java中static的特点
  12. MySQL自动化审核平台部署说明
  13. WebService学习--(二)webservice相关介绍
  14. (70)Wangdao.com第十一天_JavaScript 日期对象 Date
  15. Alpha冲刺报告(1/12)(麻瓜制造者)
  16. 题目1006:ZOJ问题(递推规律)
  17. import 与 from…import 的区别
  18. C++中的乱七八糟问题
  19. Python return语句 函数返回值
  20. [洛谷P4777]【模板】扩展中国剩余定理(EXCRT)

热门文章

  1. ThinkPHP5实用的数据库操作方法
  2. 构建单页Web应用——简单概述
  3. API Gateway和Route 53及CloudFront的连携使用
  4. 自定义实现系统max方法
  5. web storem破解
  6. 通过statCounter计算给定的RDD[Double]的统计信息的方法
  7. MapReduce分区数据倾斜
  8. Ruby 安装 – Windows
  9. 记一次为解决Python读取PDF文件的Shell操作
  10. BZOJ 3626: [LNOI2014]LCA(树剖+差分+线段树)