首先我自己没有使用自带的user表

如果model层没有AuthItem.php   那就自建一个将下面这些内容写入

<?php

namespace backend\models;

use Yii;

/**
* This is the model class for table "auth_item".
*
* @property string $name
* @property integer $type
* @property string $description
* @property string $rule_name
* @property resource $data
* @property integer $created_at
* @property integer $updated_at
*
* @property AuthAssignment[] $authAssignments
* @property AuthRule $ruleName
* @property AuthItemChild[] $authItemChildren
* @property AuthItemChild[] $authItemChildren0
* @property AuthItem[] $children
* @property AuthItem[] $parents
*/
class AuthItem extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'auth_item';
} /**
* @inheritdoc
*/
public function rules()
{
return [
[['name', 'type'], 'required'],
[['type', 'created_at', 'updated_at'], 'integer'],
[['description', 'data'], 'string'],
[['name', 'rule_name'], 'string', 'max' => 64],
[['rule_name'], 'exist', 'skipOnError' => true, 'targetClass' => AuthRule::className(), 'targetAttribute' => ['rule_name' => 'name']],
];
} /**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'name' => 'Name',
'type' => 'Type',
'description' => 'Description',
'rule_name' => 'Rule Name',
'data' => 'Data',
'created_at' => 'Created At',
'updated_at' => 'Updated At',
];
} /**
* @return \yii\db\ActiveQuery
*/
public function getAuthAssignments()
{
return $this->hasMany(AuthAssignment::className(), ['item_name' => 'name']);
} /**
* @return \yii\db\ActiveQuery
*/
public function getRuleName()
{
return $this->hasOne(AuthRule::className(), ['name' => 'rule_name']);
} /**
* @return \yii\db\ActiveQuery
*/
public function getAuthItemChildren()
{
return $this->hasMany(AuthItemChild::className(), ['parent' => 'name']); } /** * @return \yii\db\ActiveQuery */ public function getAuthItemChildren0() { return $this->hasMany(AuthItemChild::className(), ['child' => 'name']); } /** * @return \yii\db\ActiveQuery */ public function getChildren() { return $this->hasMany(AuthItem::className(), ['name' => 'child'])->viaTable('auth_item_child', ['parent' => 'name']); } /** * @return \yii\db\ActiveQuery */ public function getParents() { return $this->hasMany(AuthItem::className(), ['name' => 'parent'])->viaTable('auth_item_child', ['child' => 'name']); }}

要想使用yii rbac组件 首先需要在我们的配置文件中开启 rbac组件

在common/config/main-local.php 中添加 下边的组建

'authManager' => [
    'class' => 'yii\rbac\DbManager',
    'itemTable' => 'auth_item',
    'assignmentTable' => 'auth_assignment',
    'itemChildTable' => 'auth_item_child',
],

接下来  创建我们的表

首先创建 控制权限的四张表

这四张表的sql在  我们的yii的核心文件中  具体路径是

vendor/yiisoft/yii2/rbac/migrations/schma-mysql.sql

这是我们操作mysql的sql语句
 
另外的文件分别操作  sql server  oracle postgresql sqlite

然后  因为需要个我们的用户分配权限  我们还需要使用我们的yii的用户表  这个用户表的sql  下边给出

可以参考地址 http://www.yiichina.com/question/285

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `auth_key` varchar(32) NOT NULL,
  `password_hash` varchar(255) NOT NULL,
  `password_reset_token` varchar(255) DEFAULT NULL,
  `email` varchar(255) NOT NULL,
  `role` smallint(6) NOT NULL DEFAULT '10',
  `status` smallint(6) NOT NULL DEFAULT '10',
  `created_at` int(11) NOT NULL,
  `updated_at` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

在这里  我偷懒了一下  没有自己在写一个登录和注册功能  而是使用yii自带的登录功能  影响不大 因为 我们在进行权限操作

时,只需要只要是谁有权限就行了,其他信息不需要。如果是在项目中,user表 可以自定义

下边开始 实现rbac。我们对自己要求高一点,代码都要符合yii的规范。尽量不要使用自己的方法而是用框架封装好的

首先  创建一个model层   Rbac.php
<?php
/**
 * Created by PhpStorm.
 * User: jinlei
 * Date: 2017/2/16
 * Time: 9:58
 */

namespace frontend\models;

use yii\widgets\ActiveForm;
use yii\helpers\Html;
use yii\base\Model;

class Rbac extends Model
{
    public $power;
    public $role;
}

然后创建控制器   RbacController.php
<?php
/**
 * Created by PhpStorm.
 * User: jinlei
 * Date: 2017/1/13
 * Time: 8:47
 */

namespace backend\controllers;

use backend\models\Rbac;
use yii\web\Controller;
use yii;

class RbacController  extends Controller
{
   
}

下边开始权限的操作

第一步  添加权限

首先 来一个添加权限的页面

public function actionIndex(){
        $model = new Rbac();
        return $this->render('index',['model'=>$model]);
    }

然后创建 views 层

<?php
/**
 * Created by PhpStorm.
 * User: jinlei
 * Date: 2017/2/16
 * Time: 10:06
 */

use yii\helpers\Html;
use yii\widgets\ActiveForm;

$form = ActiveForm::begin([
    'id' => 'login-form',
    'options' => ['class' => 'form-horizontal'],
    'action'=>'?r=rbac/power',
    'method'=>'post',
]) ?>
    <?= $form->field($model, 'power') ?>

<div class="form-group">
        <div class="col-lg-offset-1 col-lg-11">
            <?= Html::submitButton('添加权限', ['class' => 'btn btn-primary']) ?>
        </div>
    </div>
<?php ActiveForm::end() ?>

然后在控制器里把权限入库

public function actionPower()
    {
        $item = \Yii::$app->request->post('Rbac')['power'];
        $auth = Yii::$app->authManager;
        $createPost = $auth->createPermission($item);
        $createPost->description = '创建了 ' . $item . ' 权限';
        $auth->add($createPost);

return $this->redirect('?r=rbac/role');
    }

接下来  创建角色

首先创建一个添加角色的表单

//创建一个就角色的表单

public function actionRole(){
        $model = new Rbac();
        return $this->render('role',['model'=>$model]);
    }

然后进入view层

<?php
/**
 * Created by PhpStorm.
 * User: jinlei
 * Date: 2017/2/16
 * Time: 13:52
 */

use yii\helpers\Html;
use yii\widgets\ActiveForm;

$form = ActiveForm::begin([
    'id' => 'login-form',
    'options' => ['class' => 'form-horizontal'],
    'action'=>'?r=rbac/addrole',
    'method'=>'post',
]) ?>
<?= $form->field($model, 'role') ?>

<div class="form-group">
        <div class="col-lg-offset-1 col-lg-11">
            <?= Html::submitButton('添加角色', ['class' => 'btn btn-primary']) ?>
        </div>
    </div>
<?php ActiveForm::end() ?>

然后将角色入库

/添加角色入库

public function actionAddrole(){
        $item = \Yii::$app->request->post('Rbac')['role'];
        $auth = Yii::$app->authManager;
        $role = $auth->createRole($item);
        $role->description = '创建了 ' . $item . ' 角色';
        $auth->add($role);

return $this->redirect('?r=rbac/rp');
    }

然后给角色分配权限

public function actionRp(){
        $model = new Rbac();
        $role =  AuthItem::find()->where('type=1')->asArray()->all();
        foreach($role as $value){
            $roles[$value['name']] = $value['name'];
        }
        $power=  AuthItem::find()->where('type=2')->asArray()->all();
        foreach($power as $value){
            $powers[$value['name']] = $value['name'];
        }

return $this->render('rp',['model'=>$model,'role'=>$roles,'power'=>$powers]);
    }

然后到views层  进行分配

<?php
/**
 * Created by PhpStorm.
 * User: jinlei
 * Date: 2017/2/16
 * Time: 14:05
 */

use yii\helpers\Html;
use yii\widgets\ActiveForm;

$form = ActiveForm::begin([
    'id' => 'login-form',
    'options' => ['class' => 'form-horizontal'],
    'action'=>'?r=rbac/empowerment',
    'method'=>'post',
]) ?>
<?= $form->field($model, 'role')->checkboxList($role) ?>
<?= $form->field($model, 'power')->checkboxList($power) ?>

<div class="form-group">

<div class="col-lg-offset-1 col-lg-11">
            <?= Html::submitButton('提交', ['class' => 'btn btn-primary']) ?>
        </div>
    </div>
<?php ActiveForm::end() ?>

然后入库

public function actionEmpowerment(){
        $auth = Yii::$app->authManager;
        $data = \Yii::$app->request->post('Rbac');
        $role = $data['role'];
        $power = $data['power'];

foreach($role as $value){
           foreach($power as $v){
               $parent = $auth->createRole($value);

$child = $auth->createPermission($v);
               //var_dump($child);
               $auth->addChild($parent, $child);
           }
       }
return $this->redirect('?r=rbac/fenpei');
    }

然后给用户分配角色

public function actionFenpei(){
        $model = new Rbac();
        $role =  AuthItem::find()->where('type=1')->asArray()->all();//注意AuthItem,如果你用的自己新建的登录表 需要将它改为  你自己的表名
        foreach($role as $value){
            $roles[$value['name']] = $value['name'];
        }
        $user=  User::find()->asArray()->all();
        foreach($user as $value){
            $users[$value['id']] = $value['username'];
        }
        return $this->render('fenpei',['model'=>$model,'role'=>$roles,'user'=>$users]);
    }

分配角色的views层

<?php
/**
 * Created by PhpStorm.
 * User: jinlei
 * Date: 2017/2/16
 * Time: 14:05
 */

use yii\helpers\Html;
use yii\widgets\ActiveForm;

$form = ActiveForm::begin([
    'id' => 'login-form',
    'options' => ['class' => 'form-horizontal'],
    'action'=>'?r=rbac/ur',
    'method'=>'post',
]) ?>
<?= $form->field($model, 'user')->checkboxList($user) ?>
<?= $form->field($model, 'role')->checkboxList($role) ?>

<div class="form-group">
        <div class="col-lg-offset-1 col-lg-11">
            <?= Html::submitButton('提交', ['class' => 'btn btn-primary']) ?>
        </div>
    </div>
<?php ActiveForm::end() ?>

将给用户分配的角色入库

public function actionUr(){
        $auth = Yii::$app->authManager;
        $data = \Yii::$app->request->post('Rbac');
        $role = $data['role'];
        $power = $data['user'];

foreach($role as $value) {
            foreach ($power as $v) {
                $reader = $auth->createRole($value);
                $auth->assign($reader, $v);
            }
        }
    }

然后  在你想要使用权限控制的控制器  添加上下面的方法

 //检测权限
public function beforeAction($action)
{
$user_id= Yii::$app->session['id'];
$action=$_REQUEST['r'];
//这句是查询你所拥有的角色所拥有的权限
$sql="select child from auth_assignment as a inner join auth_item_child as b on a.item_name=b.parent where user_id=$user_id";
$ar=\yii::$app->db->createCommand($sql)->queryAll();
//将所查出来的权限 转化为一维数组(因为下边的条件需要一个一维数组做比对)
$arr = array_column($ar, 'child');
// print_r($arr);die;
//条件里所用的函数不懂得可以百度就知道什么意思了
if(in_array($action, $arr)){
return true;
}else{
throw new \yii\web\UnauthorizedHttpException('对不起,您现在还没获此操作的权限');
}
}

这样你就可以实现  依据actionID的权限控制了

yii2 Rbac实例 (做完以下这些 会有些小的报错,相信各位都能解决,大多数都是自己命名空间上的问题)。的更多相关文章

  1. AMD电脑装完Winsows10后开机蓝屏,报错代码:cdmsnroot_s.sys

    背景:今天装了个WIN10,电脑配置:联想 IdeaPad   Z485      : AMD   A8处理器      .完成安装后电脑没有问题,安装了驱动程序后将           电脑用360 ...

  2. ubuntu 16.04 安装完QQ后,更新或apt-get报错

    apt-get install python-pip正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 您可能需要运行“apt-get -f install”来纠正 ...

  3. 使用Quartz2.2.3做持久化,启动程序后,控制台报错问题

    该错误是由mysql-connector-java.jar版本太低导致. MLog clients using log4j logging. Initializing c3p0-0.9.1.1 [bu ...

  4. 配置完xadmin源码包后启动报错“ Apps aren't loaded yet.”

    raise AppRegistryNotReady("Apps aren't loaded yet.") django.core.exceptions. 碰到这种情况就要查看下是否 ...

  5. yii2 rbac权限控制之菜单menu详细教程

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  6. yii2 rbac权限控制详细操作步骤

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...

  7. 前端进阶试题css(来自js高级前端开发---豪情)既然被发现了HOHO,那我就置顶了嘿嘿!觉得自己技术OK的可以把这套题目做完哦,然后加入高级前端的社区咯

    http://www.cnblogs.com/jikey/p/4426105.html js高级前端开发加群方法(此群很难进,里面纯技术,严禁广告,水群) 完整题目做完发邮箱(jikeytang@16 ...

  8. Yii2 RBAC 用到的表

    Yii2 RBAC用到的四张auth表位于 vendor/yiisoft/yii2/rbac/migration文件夹里面,可以用migration生成 yii migrate --migration ...

  9. php大力力 [036节] 后台系统的登录页面界面做完啦

    php大力力 [036节] 后台系统的登录页面界面做完啦 我认为做的不错,我就先不上截图啦 要你的祝福 分布注册 Twitter Login Or Signup Form 藤藤每日一练——172个Ic ...

随机推荐

  1. pm2常用的命令用法介绍

    pm2 是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的,下面我们来看pm2常用的命令用法介绍吧 ...

  2. Java 批量导入大量数据

    项目上线测试.产品说导入太慢了,一样的数据量另外一个系统只需要1分钟,我们要5分钟.... 开始以为是因为POI在解析07版本的Excel时候,因为数据量太多所以慢了,后面看下日志,发现是在入库的时候 ...

  3. 两个JS的不好设计

    1.相等判断 if(a){} 相当于 if(a == ture){} 然而下面的相等判断都为true 0 == false "" == false "false" ...

  4. Apache Solr入门教程(初学者之旅)

    Apache Solr入门教程(初学者之旅) 写在前面:本文涉及solr入门的各方面,建议边思考边实践,相信能帮助你对solr有个清晰全面的了解并能简单实用. 在Apache Solr初学者教程的这个 ...

  5. IOS 下载app

    ---------------------------------------------------------------------------------------------------- ...

  6. SSH框架学习摸索记

    Unable to load configuration. - bean - jar:file:/E:/tomcat-7.0.11/webapps/struts/WEB-INF/lib/struts ...

  7. 【CUDA】Windows 下常用函数头文件

    CUDA 函数 头文件 __global__ __device__ #include <cuda_runtime.h> threadIdx #include <device_laun ...

  8. 纪念L.A. Zadeh教授

    扎德教授永远活在我们心中 汪 培 庄 辽宁工程技术大学,智能工程与数学研究院,阜新,123000 摘要 全球科技工作者都在悼念扎德教授的逝世.本文对扎德创立模糊数学的历史意义,他与中国同仁的关系和影响 ...

  9. 主机连接虚拟机redis 服务器

    1. centos 虚拟机安装redis sudo yum install epel-release sudo yum update sudo yum install redis sudo syste ...

  10. python安装scrapy

    Scrapy基于事件驱动网络框架 Twisted 编写,Twisted是一个异步非阻塞框架. 安装 scrapy 要先安装 Twisted,不然无法安装成功,链接: Python Extension ...