最近在用Yii开发B2C商城,今天把其中的权限管理发布与大家一起学习。
第一步:配置权限,我这边是写在配置文件里的。
//权限配制数据 public static $aclList = array( 'order'=>array( 'name'=>'订单', 'ctl'=>array( array( 'name'=>'订单列表', 'list_ctl'=>array('default'), 'act'=>array( 'default'=>array( 'name'=>'订单', 'default_id'=>'index', 'list_act'=>array('index'=>'订单列表','update'=>'订单编辑','delete'=>'删除订单') ), ) ) ) ), 'goods'=>array( 'name'=>'商品', 'ctl'=>array( array( 'name'=>'商品管理', 'list_ctl'=>array('default'), 'act'=>array( 'default'=>array( 'name'=>'商品列表', 'default_id'=>'index', 'list_act'=>array('index'=>'商品列表') ), ) ), array( 'name'=>'商品配置', 'list_ctl'=>array('cat'), 'act'=>array( 'cat'=>array( 'name'=>'商品分类', 'default_id'=>'index', 'list_act'=>array('index'=>'分类列表') ), ), ), ) ), 'desktop'=>array( 'name'=>'系统', 'ctl'=>array( array( 'name'=>'管理员和权限', 'list_ctl'=>array('role','user'), 'act'=>array( 'role'=>array( 'name'=>'角色管理', 'default_id'=>'index', 'list_act'=>array('index'=>'角色列表','update'=>'角色编辑') ), 'user'=>array( 'name'=>'操作员管理', 'default_id'=>'index', 'list_act'=>array('index'=>'操作员列表') ), ) ) ) ), );
第二步:建立权限与角色关系
CREATE TABLE `NewTable` (`role_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '角色ID' ,`group_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '组名称' ,`acl` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '权限' ,`status_is` enum('Y','N') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'Y' COMMENT '状态' ,`create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '录入时间' ,PRIMARY KEY (`role_id`))ENGINE=InnoDBDEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ciCOMMENT='管理员组'AUTO_INCREMENT=4ROW_FORMAT=COMPACT;
alc值为:moduleID_controllerID_actionID,moduleID_controllerID_actionID......组成的字符串。
第四步:管理员与角色绑定
简单点在管理员表里添加一个字段用来存放角色ID,管理员登录后台就能通过角色ID获取角色。
第五步:后台菜单过滤
通过获取到的角色进行后台菜单过滤。
/** * 后台菜单过滤 * */ static public function filterMenu($acl_list,$super) { $item = self::$aclList; if ($super == 1) return $item; foreach ($item as $k=>$v) { foreach ($v['ctl'] as $kk=>$vv) { foreach ($vv['act'] as $kkk=>$vvv) { $acl = $k.'_'.$kkk.'_'.$vvv['default_id']; if (!in_array($acl,$acl_list)) { unset($item[$k]['ctl'][$kk]['act'][$kkk]); } } if (empty($item[$k]['ctl'][$kk]['act'])) unset($item[$k]['ctl'][$kk]); } if (empty($item[$k]['ctl'])) unset($item[$k]); } return $item; }
这边是通过
第六步:这些权限如何在后台页面显示出来
ActList as $k=>$v):?>
- module==$k&&$_GET['r']!='desktop/default/index'?'style="display: block;"':'';?>>
- module==$k&&in_array(Yii::app()->controller->id,$vv['list_ctl'])?'open':'';?>">
- module==$k&&in_array(Yii::app()->controller->id,$vv['list_ctl'])&&$_GET['r']!='desktop/default/index'?'block':'none';?>;"> $vvv):?>
- module==$k&&Yii::app()->controller->id==$kkk?'active':'';?>"> / / ">
看起来是是循环多了点,主要是前面配置权限参数时候循环多了。
第七步:单个权限验证。
虽然在左侧菜单已经将不属于管理员的权限显示,但防止有漏网之鱼,需要在基类里添加验证功能。
/** * 权限验证 * * @param $acl * @param $super */ public function Pemission($acl,$super) { if ($super == 1) return; $r = $_GET['r']; $permission = str_replace('/','_',$r); $except = array( 'desktop/default/index', 'desktop/default/permission' ); if (!in_array($r,$except) && !in_array($permission,$acl)) { $this->redirect('?r=desktop/default/permission&redirect='.Yii::app()->request->urlReferrer); } }
第八步:在页面里单个小功能。
我们也通过具体的route进行判断。
至此,我完成了Yii开发的系统后台的权限管理,可以根据route进行管理,精确到action。
以上的功能来源。