• 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

  • 相关阅读:
    tomcat 调优-生产环境必备
    Spring中 BeanFactory和ApplicationContext的区别
    延迟队列DelayQueue简单入门
    RedisTemplate中opsForValue的使用 (复制粘贴的,没有练习,找时间回顾 )
    yum安装nginx的默认目录详解
    Centos 6无法使用yum解决办法
    JVM:jmap heap 堆参数分析MinHeapFreeRatio、MaxHeapFreeRatio、MaxHeapSize、NewSize、MaxNewSize
    maven下载Oracle jar包
    idea查看源代码出现/* compiled code */
    今日进度
  • 原文地址:https://www.cnblogs.com/imxiu/p/3415032.html
Copyright © 2020-2023  润新知