• php后台权限的设计逻辑方法收集


    1.设计admin_group表

    2.建立群组,添加权限:

    首页添加权限模型(model):

    <?php
    
    class XAdminiAcl{
    
    //一共分为三级,首页为一级,’action'下的name为第二级,'list_acl'下的name为第三级。
    //权限配制数据
    	public static $aclList = array(
    	'首页' => array(                                           
        	   'controller'=>'home', 'url'=>'default/home','acl'=>'home','action'=>array(
                    array('name'=>'系统首页','url'=>'default/home','acl'=>'home_index','list_acl'=>array()),
                    array('name'=>'栏目管理','url'=>'catalog/index','acl'=>'config_catalog','list_acl'=>array(
                            '录入'=>'catalog_create', '编辑'=>'catalog_update','删除'=>'catalog_delete','排序'=>'catalog_sort_order'
                            )),
            	)
              ),
        	
        	'设置' => array(
        	   'controller'=>'config', 'url'=>'config/index', 'acl'=>'config','action'=>array(
                    array('name'=>'站点设置','url'=>'config/index','acl'=>'config_index','list_acl'=>array()),
                    array('name'=>'SEO设置','url'=>'config/seo','acl'=>'config_seo','list_acl'=>array()),
                    array('name'=>'上传设置','url'=>'config/upload','acl'=>'config_upload','list_acl'=>array()),
            		array('name'=>'自定义设置','url'=>'config/custom','acl'=>'config_custom','list_acl'=>array()),
            	)
              ),
        	'内容' => array(
        	   'controller'=>'post', 'url'=>'post/index', 'acl'=>'post','action'=>array(
                    array('name'=>'内容管理','url'=>'post/index','acl'=>'post_index','list_acl'=>array(
                            '录入'=>'post_create', '编辑'=>'post_update', '批量审核'=>'post_verify', '批量推荐'=>'post_commend', '删除'=>'post_delete'
                            )),
                    array('name'=>'评论管理','url'=>'post/comment','acl'=>'post_comment','list_acl'=>array(
                            '回复'=>'post_comment_update',  '删除'=>'post_comment_delete'
                            )),
                    array('name'=>'专题管理','url'=>'post/special','acl'=>'post_special','list_acl'=>array(
                            '录入'=>'post_special_create', '编辑'=>'post_special_update',  '删除'=>'post_special_delete'
                            )),
                    array('name'=>'单页管理','url'=>'page/index','acl'=>'page_index','list_acl'=>array(
                            '录入'=>'page_create', '编辑'=>'page_update', '删除'=>'page_delete'
                            )),
            	)
              ),
            '用户' => array(
               'controller'=>'user', 'url'=>'admin/index', 'acl'=>'user','action'=>array(
                    array('name'=>'管理员列表','url'=>'admin/index','acl'=>'admin_index','list_acl'=>array(
                            '录入'=>'admin_create', '编辑'=>'admin_update', '删除'=>'admin_delete'
                            )),
                    array('name'=>'管理员权限','url'=>'admin/group','acl'=>'admin_group','list_acl'=>array(
                            '录入'=>'admin_group_create', '编辑'=>'admin_group_update', '删除'=>'admin_group_delete'
                            )),
                    array('name'=>'管理员日志','url'=>'logger/admin','acl'=>'admin_logger','list_acl'=>array(
                            '删除'=>'admin_logger_delete'
                            )),
                    array('name'=>'留言反馈','url'=>'question/index','acl'=>'question_index','list_acl'=>array(
                            '回复'=>'question_update', '删除'=>'question_delete'
                            )),
                )
              ),
         
    }
    

     然后views页面页面的获得:

    <?php $i = 0; foreach((array)XAdminiAcl::$aclList as $key=>$menu):?>
      
      <tr>
        <td  colspan="2"><?php if($menu['controller'] !='home'):?>
          <input name="acl[]" type="checkbox" value="<?php echo $menu['controller'] ?>"
    	  <?php if(in_array($menu['controller'], explode(',', $model->acl))): ?>
    	  checked="checked"<?php endif ?> level='0' onclick='javascript:checknode(this);'/>
          <?php endif?>
    	  
          <?php echo $key ?></td>  //获得第一级
      </tr>
      
      
      <?php foreach((array)$menu['action'] as $k=>$module):?>
      <?php if($module['name'] != '首页'):?>
      <tr >
        <td  width="17%" >     
          <input name="acl[]" type="checkbox" value="<?php echo $module['acl'] ?>" 
    	  <?php if(in_array($module['acl'], explode(',', $model->acl))): ?>
    	  checked="checked"<?php endif ?> level='1' onclick='javascript:checknode(this);'/>
          <?php echo $module['name']?></td>  //获得第二级
    
    
    <td class="vtop tips2"><?php foreach((array)$module['list_acl'] as $aclName=>$acl):?> 
    <input name="acl[]" type="checkbox" value="<?php echo $acl ?>"
    <?php if(in_array($acl, explode(',', $model->acl))): ?> checked="checked"<?php endif ?> level='2' onclick='javascript:checknode(this);'/>
    <?php echo $aclName?> //获得第三级数据
    <?php endforeach; ?></td> </tr>
    <?php endif?>

    <?php endforeach; ?>
    <?php $i++;endforeach;?>

      注意事项:当点击第三级,第二级的check的也要改为checked,所以需要添加js:

    <script type="text/javascript">
        function checknode(obj) {
            var chk = $("input[type='checkbox']");
            var count = chk.length;
            var num = chk.index(obj);
            var level_top = level_bottom = chk.eq(num).attr('level');
    		for (var i = num; i >= 0; i--) {
                var le = chk.eq(i).attr('level');
                if (eval(le) < eval(level_top)) {
                    chk.eq(i).attr("checked", true);
                    var level_top = level_top - 1
                }
            }
            for (var j = num + 1; j < count; j++) {
                var le = chk.eq(j).attr('level');
                if (chk.eq(num).attr("checked") == true) {
                    if (eval(le) > eval(level_bottom)) chk.eq(j).attr("checked", true);
                    else if (eval(le) == eval(level_bottom)) break
                } else {
                    if (eval(le) > eval(level_bottom)) chk.eq(j).attr("checked", false);
                    else if (eval(le) == eval(level_bottom)) break
                }
            }
        }
    </script>
    

      

    Controller里面:

     /**
         * 管理组录入
         *
         */
        public function actionGroupCreate ()
        {
            parent::_acl(); 
            $model = new AdminGroup();
            if (isset($_POST['AdminGroup'])) {
                $model->attributes = $_POST['AdminGroup'];
                $acl = Yii::app()->request->getPost('acl');  //获得权限
                if (is_array($acl)) {
                    $model->acl = implode(',', array_unique($acl));
     //取得唯一并且将数组转化成字符串
                } else {
                    $model->acl = 'administrator';
                }
                if ($model->save()) {
                  
                    $this->redirect(array ('group' ));
                }
            }
            $this->render('group_create', array ('model' => $model ));
        }
    

      最后每个操作判断权限,如果没有权限就抛出提醒异常(父类控制器):

    protected function _acl ($action = false, $params = array('ajax'=>false, 'append'=>',default_index,default_home'))
        {
            $actionFormat = empty($action) ? strtolower($this->id . '_' . $this->action->id) : strtolower($action);
    //$this->id等于控制器名字 $this->action->id等于动作的名字 $permission = self::_sessionGet('_adminiPermission'); if ($permission != 'administrator') { //登陆时设置一个session存储它的permission,当permisson不是超级管理员时,那些操作要给与判断 $adminiGroup = self::_sessionGet('_adminiGroupId'); $aclDb = AdminGroup::model()->find('id=:id', array ('id' => $adminiGroup )); if (! in_array($actionFormat, explode(',', strtolower($aclDb->acl) . $params['append']))) { if($params['ajax'] == false){ XUtils::message('error', '当前角色组无权限进行此操作,请联系管理员授权', $this->createUrl('index'), 20); }else{ $var['state'] = 'error'; $var['message'] = '当前角色组无权限进行此操作,请联系管理员授权'; exit(CJSON::encode($var)); } } } }

      

  • 相关阅读:
    linux扩展分区
    linux开机出现initramfs无法进入系统
    openCV编译安装-MSCV-Windows10-Qt
    Qt一键部署配置(Qt程序打包)
    Part8 升序排序 和降序排序
    Part7-.简单查询1
    Part6-向表中插入数据
    Part5-修改表(添加字段、删除字段、查看删除是否成功)
    Part4-删除表
    Part3-复制表
  • 原文地址:https://www.cnblogs.com/fengzhiqiangcaisangzi/p/3368417.html
Copyright © 2020-2023  润新知