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(这里写要判断的权限);