zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    js实现点击隐藏图片
    绝对定位给图片四角加上图片修饰
    雪碧图实现登陆页面
    弹性盒模型
    数组练习--求数组和,平均值,最大值,最小值
    h5与c3权威指南笔记--css3结构性伪类选择器root,not,empty,target
    h5与c3权威指南笔记--css3新属性选择器
    闲聊Java里的随机数
    Python之简单抓取豆瓣读书信息
    中本聪比特币论文
  • 原文地址:https://www.cnblogs.com/imxiu/p/3415032.html
Copyright © 2011-2022 走看看