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

YII 权限管理的更多相关文章

  1. YIi 权限管理和基于角色的访问控制

    验证和授权(Authentication and Authorization) 定义身份类 (Defining Identity Class) 登录和注销(Login and Logout) 访问控制 ...

  2. Yii之权限管理扩展 srbac

    最近在研究 Yii 的权限控制功能,尽管Yii 自身提供了一个简单的权限管理,但是很多时候,我们还是需要对其做一点扩展. 在这里,我向大家推荐一个不错的扩展:SRBAC. 在Yii的官方网站的exte ...

  3. Yii框架中使用SRBAC作为权限管理模块时遇到的问题

    Yii框架中使用SRBAC作为权限管理模块时遇到的问题   看到Yii中提供RBAC的插件,SRBAC,就想用用. 结果按照手册上的安装办法,整来整去,安装完了,可就是进不了权限管理界面. 最后想到, ...

  4. yii2 rbac权限管理学习笔记

    下面介绍一个 yii2 的 Rbac 权限管理设置,闲话少说,直接上代码, 1.首先我们要在组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者main ...

  5. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  6. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  7. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  8. SpringMVC+Shiro权限管理【转】

    1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...

  9. Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...

随机推荐

  1. struts2与spring集成时action的class属性值意义

    struts2单独使用时action由struts2自己负责创建:与spring集成时,action实例由spring负责创建(依赖注入).这导致在两种情况下struts.xml配置文件的略微差异. ...

  2. linux根目录详解

    ubuntu 文件说明:http://tech.ccidnet.com/art/302/20080118/1347213_1.html/ 根目录  |  |-boot/ 启动文件.所有与系统启动有关的 ...

  3. webapp中的日期选择

    你是否在开发webapp时,选择用哪种第三方日期选择控件绞尽脑汁? 其实不用那么麻烦,现在移动端都是WebKit内核,支持HTML5,其实只要弱弱的将input中将type="date&qu ...

  4. c++读文件-对try-throw-catch的应用

    #include<iostream> #include<fstream> #include<stdlib.h> #include<stdio.h> us ...

  5. linux常用命令搜索

    解压tar - xzvf webcmp.tar.gz /目的目录 压缩tar - czvf webcmp.tar.gz /压缩源文件 发包命令 cd /cap/sc_bossdata_20140516 ...

  6. 文件操作 - NSFileManager

    iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容.iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内.默认 ...

  7. 寡人写的第一个HTML5页面

    好吧,其实是抄来的 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"/> &l ...

  8. jQuery响应式幻灯片插件jquery.glide.js(支持触摸&轻量级)

    找到一款好的幻灯片插件不容易,找到一款功能全并且使用很简单的幻灯片更不容易,今天为大家分享一款全能的幻灯片插件glide.js,也是我现在在使用的一款插件. jquery.glide.js是响应和触摸 ...

  9. 高级PHP应用程序漏洞审核技术

    前言 PHP是一种被广泛使用的脚本语言,尤其适合于web开发.具有跨平台,容易学习,功能强大等特点,据统计全世界有超过34%的网站有php的应 用,包括Yahoo.sina.163.sohu等大型门户 ...

  10. Json 返回日期格式转换

    //日期转换 function ChangeDateFormat(time) { if (time != null) { var date = new Date(parseInt(time.repla ...