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

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

要想使用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的权限控制了

时间: 2024-08-05 23:19:35

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

oracle全备恢复后,再做0级增备恢复时的报错

2015-11-20 RMAN> sql 'alter database open resetlogs'; sql statement: alter database open resetlogs RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00

yii2 php namespace 引入第三方非namespace库文件时候,报错:Class not found 的解决

一个类文件时namespace的库方式 通过下面的方式引入类,报错  Class Not Found: namespace frontend\block\customer\account; use Yii; use frontend\block\Blockbase; //use yii\base\Model; //use backend\models\helper\Base.php use frontend\models\core\Request; use frontend\models\cor

新安装完 tensorflow 后import tensorflow as tf 报错

>>> import tensorflow as tf /opt/anaconda3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 =

做UI自动化一直启动不成功Chrome 报错:请停用以开发者模式......

1.遇见这个问题,先看看是否chromedriver没生效 2.找到代码对应目录,下载chrome对应版本的chromedriver替换进去 package com.sf.acsp.ebill.testcase; import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;//import org.openqa.selenium.firefox.FirefoxDriver;import o

普通人如何做到30分钟读一本书并做完笔记?

作为有速读功力的非正常人( 读书 20000 字 / 分钟),我最常被问的问题是:「如何入门速读?」 这个问题,基本上已经变成一个月经题,我针对这个问题也大概写了 N 篇 FAQ.不过基本上也抵挡不了凶猛询问的群众. 这促成了提笔写下这篇文章的动机. 1 快速学习已经变成一个趋势   不少学习类型的公众号,最常谴责一种「快速学习」的心态,他们认为功夫是得慢慢练成的.我并不反对这种论点,许多功夫精进真是得需要时间沉淀的.但是我始终认为「入门」这件事,却是有办法加速的. 再来,很多人入不了门,办不成

k8s实践6:从解决报错开始入门RBAC

1.在k8s集群使用过程中,总是遇到各种rbac的权限问题.记录了几个报错,见下: 报错1: "message": "pods is forbidden: User \"kubernetes\" cannot list resource \"pods\" in API group \"\" at the cluster scope" "message": "pservices

做完和做好不一样

你知道吗?在职场中的做完和做好是不一样的. 在职场中,很多人都会抱怨,认为自己工作多,老板总是让他们每天干那个干这个,而且事情基本上都是重复的.当他们怨天不由人的时候,却没有想过原因. 除了基础的日常工作,老板为什么会让你反复去做同一件事呢?你在第一次执行时是不是哪里没有做好呢?老板是不是因为对之前的执行结果不满意,所以要你再做一次呢? 有没有想过,这个问题出在哪里.有的时候总是以为自己做了很多,却没有想一想自己做得怎么样. 那么,每天看似忙碌不跌的你,在工作中执行任务时,是否也只是满足于"做&

《Excel效率手册:早做完,不加班》

<Excel效率手册:早做完,不加班> 基本信息 作者: 陈锡卢    杨明辉 出版社:清华大学出版社 ISBN:9787302350743 上架时间:2014-5-8 出版日期:2014 年4月 开本:16开 页码:258 版次:1-1 所属分类:计算机 > 办公软件 > OFFICE > Excel 更多关于>>> <Excel效率手册:早做完,不加班> 内容简介 书籍 计算机书籍 <excel效率手册:早做完,不加班>是一本有趣

刚做完几个简单的响应式设计的网站项目下来,杂七杂八 (一)

之前没接触过responsive design这玩意,突然最近客户的项目都要求要有响应式设计的要求: 1,当浏览器缩放时,页面要根据浏览器大小,而自动适应. 2,当用手机或者移动设备打开页面时,页面会根据屏幕浏览器的大小自动适应. 3,移动设备有横屏和竖屏之分,页面也要相应适应 首页设计 UI设计师只设计出了2种mockup,一种是full site一种是mobile site然后扔过来,一看那mockup就知道是当前比较流行的设计风格. 1,页头head,左logo右菜单:在full site