关于Yii 后台权限管理分享

原创
2015/01/12 19:15
阅读数 360

最近在用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=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
COMMENT='管理员组'
AUTO_INCREMENT=4
ROW_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;
    }

 这边是通过

第六步:这些权限如何在后台页面显示出来

<?php foreach ($this->ActList as $k=>$v):?>
                <li class="<?php echo $this->module==$k&&$_GET['r']!='desktop/default/index'?'open':'';?>">
                    <a href="#" class="dropdown-toggle">
                        <i class="icon-desktop"></i>
                        <span class="menu-text"><?php echo $v['name'];?></span>
                        <b class="arrow icon-angle-down"></b>
                    </a>
                    <ul class="submenu" <?php echo $this->module==$k&&$_GET['r']!='desktop/default/index'?'style="display: block;"':'';?>>
                        <?php foreach ($v['ctl'] as $vv):?>
                        <li class="<?php echo $this->module==$k&&in_array(Yii::app()->controller->id,$vv['list_ctl'])?'open':'';?>">
                            <a href="#" class="dropdown-toggle">
                                <i class="icon-double-angle-right"></i>
                                <?php echo $vv['name'];?>
                                <b class="arrow icon-angle-down"></b>
                            </a>
                            <ul class="submenu" style="display: <?php echo $this->module==$k&&in_array(Yii::app()->controller->id,$vv['list_ctl'])&&$_GET['r']!='desktop/default/index'?'block':'none';?>;">
                                <?php foreach ($vv['act'] as $kkk=>$vvv):?>
                                <li class="<?php echo $this->module==$k&&Yii::app()->controller->id==$kkk?'active':'';?>">
                                    <a href="?r=<?php echo $k;?>/<?php echo $kkk;?>/<?php echo $vvv['default_id'];?>">
                                        <i class="icon-leaf"></i>
                                        <?php echo $vvv['name'];?>
                                    </a>
                                </li>
                                <?php endforeach;?>
                            </ul>
                        </li>
                        <?php endforeach;?>
                    </ul>
                </li>
                <?php endforeach;?>

看起来是是循环多了点,主要是前面配置权限参数时候循环多了。

第七步:单个权限验证。

虽然在左侧菜单已经将不属于管理员的权限显示,但防止有漏网之鱼,需要在基类里添加验证功能。

/**
     * 权限验证
     *
     * @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。

 以上的功能来源Yiishop商城

展开阅读全文
打赏
1
5 收藏
分享
加载中
更多评论
打赏
0 评论
5 收藏
1
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部