CREATE TABLE IF NOT EXISTS `admin_role` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`update_time` int(10) unsigned NOT NULL default '',
`status` tinyint(1) unsigned NOT NULL default '',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `admin_role_child` (
`role_id` int(10) unsigned NOT NULL,
`item_id` int(10) unsigned NOT NULL,
KEY `item_id` (`item_id`),
KEY `role_id` (`role_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `admin_role_item` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`parent_id` int(10) unsigned NOT NULL,
`description` text,
`update_time` int(10) unsigned NOT NULL default '',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

解释一下数据库:
admin_role是角色表,update_time字段是用来做Query Cache的,可要可不要
admin_role_child是权限分配表,只用来保存相应的role拥有的权限
admin_role_item是权限的具体信息,update_time字段也是用来做Query Cache的,可要可不要
然后再说说权限的判断方式:
首先,在数据库保存的权限信息为这种格式:controller/action,就像YII的url route一样,但是他有一种简便的写法,如果要给那个角色某个controller的所有权限,就只要这样写:controller/*
然后,写一个class,扩展自CApplicationComponent或者CAuthManager,无论扩展自那个class,对我这个影响都不大,如果你需要更多的yii原生的class支持,你可以优先考虑CAuthManager。
然后,我的AuthManager里面只有一个方法checkAccess,方法的参数参照CAuthManager的checkAccess,因为要方便CWebUser的调用,代码如下:

* @param array $itemName 需要验证权限的controller id and action id
* @param mixed $userId 需要验证权限的user id
* @param array $params 验证权限附带的参数
* @return boolean 验证结果
*/
public function checkAccess($itemName, $userId, $params=array ( ))
{
$criteria = new CDbCriteria(array('select'=>'is_supper', 'condition'=>'id = :userId', 'params'=>array(':userId'=>$userId)));
$user = Admin::model()->find($criteria);
if ($user->is_supper == 1) return true;
// 获取controller and action
$itemName = explode('/', strtolower($itemName));
$controller = $itemName[0];
$action = $itemName[1];
// 获取会员角色组
$role = AdminRole::model()->getByUser($userId);
Dumper::dump($role->items);Yii::app()->end();
if ($role !== null) foreach ($role->items as $item)
{
// 获取会员角色组权限
$item = explode('/', strtolower($item->name));
// 如果拥有当前控制器权限
if ($item[0] === $controller)
{
// 如果拥有所有权限
if ($item[1] === '*') return true;
// 如果拥有指定权限
else if ($item[1] === $action) return true;
}
}
return false;
}

只要在要验证的时候写句话就行了,Yii::app()->user->checkAccess(这里写要判断的权限);

Form: http://jianghaiming0426.blog.sohu.com/180407079.html

最新文章

  1. php-into 安装时遇到的各种问题,php -m跟phpinfo()显示不一致
  2. 对Ip地址进行验证
  3. [原创]自定义view之:快速开发一款Material Design风格的dialog的开源项目MDDialog
  4. all things are difficult before they are easy
  5. 案例:Oracle报错ASM磁盘组不存在或没有mount
  6. Python多线程爬虫与多种数据存储方式实现(Python爬虫实战2)
  7. Conway生命游戏
  8. 红黑树与AVL特性
  9. 二:C#对象、集合、DataTable与Json内容互转示例;
  10. SFTP远程连接服务器上传下载文件-vs2013项目实例
  11. OLED小记
  12. mysql_union操作符
  13. sea.js与require.js的区别
  14. Angular快速学习笔记(3) -- 组件与模板
  15. SpringCloud微服务部署
  16. 微信小游戏 50M那部分的缓存机制的使用
  17. 贴心的vs 备注提醒功能
  18. cmd 中运行testng代码
  19. 【性能测试】脚本开发,最普通的http协议脚本
  20. Java实现类似类似百度搜索模糊关键字

热门文章

  1. easy ui tabs 顶部绑定事件
  2. 服务器返回的JSON字符串
  3. Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks(1)
  4. u-boot代码学习内容
  5. 一个matlab数字图像处理程序的解释
  6. 点评VHDL语言
  7. 【原创】Matlab中plot函数全功能解析
  8. 转:Nginx 日志文件切割
  9. Android sqlite 数据库在java代码中的增删改查
  10. 老陈---谈Delphi中SSL协议的应用[转]