首先我自己没有使用自带的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. Linux md5sum 的用法

    MD5 算法常常被用来验证网络文件传输的完整性,防止文件被篡改.MD5 全称是报文摘要算法,此算法对任意长度 的信息逐位计算,产生一个二进制长度为 128 位(十六进制长度 32 位)的报文摘要,不同 ...

  2. 【SMTP】常见错误码

    '* 邮件服务返回代码含义 '* 500 格式错误,命令不可识别(此错误也包括命令行过长) '* 501 参数格式错误 '* 502 命令不可实现 '* 503 错误的命令序列 '* 504 命令参数 ...

  3. Mongo数据库操作/数据库版本号

    第一步,找到mongodb安装目录第二步,从命令行进入mongodb安装目录下的bin目录 附:http://www.runoob.com/mongodb/mongodb-create-databas ...

  4. HDU 2612 (2次BFS,有点小细节)

    Problem Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. L ...

  5. 文献导读 | A Pan-Cancer Analysis of Enhancer Expression in Nearly 9000 Patient Samples

    Chen, H., Li, C., Peng, X., Zhou, Z., Weinstein, J.N., Liang, H. and Cancer Genome Atlas Research Ne ...

  6. VUE.js 简单引用

    Vue开发的两种方式:静态资源引入开发 和 脚手架交互式开发 这里使用的是静态资源引入开发 首先 引用jquery.js  和  vue.js html 标签内加个 <div id=" ...

  7. Servlet的5种方式实现表单提交

    http://www.cnblogs.com/zhanghaoliang/p/5622900.html

  8. arrow function、function.apply

    An arrow function expression has a shorter syntax than a function expression and does not have its o ...

  9. Gitlab CR

    Gitlab 进行 CR 的强限制,原理很简单. 实现起来,利用的是 git 自身的 custom_hooks 的支持,以及需要对 gitlab 做一点操作,对它的数据库开放一个只读权限的账号,来处理 ...

  10. Win10系列:C#应用控件基础23

    Telerik UI Controls for Windows 8 Telerik UI Controls for Windows 8是一套为创建Windows UWP应用而设计的工具集,开发人员可以 ...