YII 权限管理

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 '0',
`status` tinyint(1) unsigned NOT NULL default '1',
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 '0',
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

原文地址:https://www.cnblogs.com/imxiu/p/3415032.html