yii2 RBAC使用DbManager实现后台权限判断的方法


Posted in PHP onJuly 23, 2016

本文实例讲述了yii2 RBAC使用DbManager实现后台权限判断的方法。分享给大家供大家参考,具体如下:

首先根据文档生成yii2 框架中的表

yii migrate --migrationPath=@yii/rbac/migrations/

生成如下4表:

auth_assignment
auth_item_child
auth_item
auth_rule

使用yii的gii快速生成对应的model,但是由于auth_item表同时存储角色跟权限,由于后面我们要分角色跟权限来做curd操作,所以我这里新建了一个RoleForm和PermissionForm两个model来区分开角色与权限。由于角色跟权限紧紧相连,又在auth_item生成的model中多加一个属性$child,后面会用到现在先不管。

下面是角色model的相关代码

<?php
namespace app\models;
use Yii;
use app\models\AuthItem;
use yii\rbac\Item;
/*
 * 角色model
 * 指尖上的艺术家
 */
class RoleForm extends AuthItem
{
  public function init() {
    parent::init();
    $this->type = Item::TYPE_ROLE;//yii-rbac-Role隐藏继承常量这里的值是1
  }
}

下面是权限model的相关代码

<?php
namespace app\models;
use Yii;
use app\models\AuthItem;
use yii\rbac\Item;
/*
 * 权限model
 * 指尖上的艺术家
 */
class PermissionForm extends AuthItem
{
  public function init() {
    parent::init();
    $this->type = Item::TYPE_PERMISSION;//常量值 2
  }
}

另外在AuthItem模型中增加一个属性

<?php
class AuthItem.....
public $child;//用于角色权限添加
......

现在到我们对应的控制器了

首先我们说权限控制器写控制器的时候要用到系统自带的扩展
。。。
use yii\rbac\Permission;
。。。

/*
 * 权限添加
 */
public function actionCreate() {
  $model = new PermissionForm();
  if( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
    //rbac中permission对象
    $permission = new Permission();
    $permission->name = trim( $model->name );
    $permission->type = $model->type;
    //权限添加
    Yii::$app->authManager->add( $permission );
  }
}

修改的时候 其他的不变就是换了个方法

/*
 * param string $name 修改的权限名
 * param Object $permission 跟添加一样提交上来的数据
 */
Yii::$app->authManager->update( $name, $permission );

这里是删除

//Returns the named permission.
$permission = Yii::$app->authManager->getPermission( $name );
//Removes a permission or rule from the RBAC system.
Yii::$app->authManager->remove( $permission );

权限的cud都搞定了,查看就不写了

下面是角色控制器

带上这个

use yii\rbac\Role;
/*
 * 角色添加
 */
public function actionCreate() {
  $model = new RoleForm();
  if ( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
      //实例化角色对象
      $role = new Role();
      $role->name = $model->name;
      $role->type = $model->type;
      //添加角色
      Yii::$app->authManager->add( $role );
  }
  //权限列表( 添加角色的时候我们就可看到当前有没有权限来添加 )
  $permissions = $this->loadPermission();
  //将$model跟$permissions....渲染到视图就好了
}
/*
 * 修改
 * param string $name 修改的角色名
 * param Object $role 跟添加一样提交上来的数据
 */
$bool = Yii::$app->authManager->update( $name, $role );

删除的时候就比较麻烦了

/*
 * param string $name 角色名
 */
$role = Yii::$app->authManager->getRole( $name );//获取当前角色对象
//Returns the child roles.
$childAll = Yii::$app->authManager->getChildren( $role );
if ( isset($childAll) ) {//逐一删除权限
  foreach ($childAll as $value) {
    //Returns the named permission.
    $perObj = Yii::$app->authManager->getPermission($value);
    //Removes a child from its parent.
    Yii::$app->authManager->removeChild( $role, $perObj );
  }
}
Yii::$app->authManager->remove( $role );//最后删除我们的角色了

最最关键的就是我们要给角色赋予权限对吧,如下代码

//当前角色所拥有的权限
$childArray = $this->loadRolePermission( $model->name );//这个就是返回权限数组
if ( !empty( $childArray ) ) {
  $model->child = $childArray;
}
else {
  $model->child = array();
}
//Returns all permissions in the system.
$permissions = Yii::$app->authManager->getPermissions();
$perArr = array();
foreach ($permissions as $key => $value) {
  $perArr[$value->name] = $value->name;
}
if ( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
  //角色对象
  $child = isset( $_POST['AuthItem']['child'] ) ? $_POST['AuthItem']['child'] : NULL;
  //表单无法验证child所以当为空的时候跳回原页面
  if ( empty( $child ) ) {
    return $this->redirect(..你们要跳的页面..);
  }
  //判断角色是否分配权限,已分配则删除,反之增加新的
  if ( !empty( $childArray ) ) {
    //Removed all children form their parent.
    $bool = Yii::$app->authManager->removeChildren( $model );
    if ( !$bool ) {
      throw new HttpException(404, '别想糊弄我!凑你一脸~~~');
    }
  }
  //当前角色对象
  $role = Yii::$app->authManager->getRole( $model->name );
  //child权限添加
  if( isset( $child ) ) {
    foreach ( $child as $val) {
      //获取权限
      $childObj = Yii::$app->authManager->getPermission($val);
      //给item_child表写入数据(权限表)
      Yii::$app->authManager->addChild( $role, $childObj );
    }
    return $this->redirect(..你们要跳的页面..);
  }
}

最后就是我们最后一个控制器了角色与用户关联

/*
 * 创建角色跟用户之间关联的关键部分代码
 */
//Returns the named role.
$role =Yii::$app->authManager->getRole( $roleName );
// Assigns a role to a user.
Yii::$app->authManager->assign( $role, $userId );<pre name="code" class="php">/*
 * 权限检测
 * param int| string $userId 用户id
 * param string $permission 权限名
 */
Yii::$app->authManager->checkAccess( $userId , $permission ) )

下面是判断权限的

/*
 * 权限检测
 * param int| string $userId 用户id
 * param string $permission 权限名
 */
Yii::$app->authManager->checkAccess( $userId , $permission ) )

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
国内php原创论坛
Oct 09 PHP
PHP中将ip地址转成十进制数的两种实用方法
Aug 15 PHP
学习php中的正则表达式
Aug 17 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
Dec 10 PHP
php设计模式之委托模式
Feb 13 PHP
PHP输出多个元素的排列或组合的方法
Mar 14 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
Apr 04 PHP
PHP使用Session实现上传进度功能详解
Aug 06 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
Sep 10 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 PHP
php抽象方法和普通方法的区别点总结
Oct 13 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
Feb 10 PHP
Yii2简单实现多语言配置的方法
Jul 23 #PHP
yii2控制器Controller Ajax操作示例
Jul 23 #PHP
PHP实现清除MySQL死连接的方法
Jul 23 #PHP
php实现批量修改文件名称的方法
Jul 23 #PHP
golang与PHP输出excel示例
Jul 22 #PHP
PHP微信支付实例解析
Jul 22 #PHP
golang与php实现计算两个经纬度之间距离的方法
Jul 22 #PHP
You might like
ThinkPHP写第一个模块应用
2012/02/20 PHP
如何让CI框架支持service层
2014/10/29 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
js和as的稳定传值问题解决
2013/07/14 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
基于Bootstrap实现tab标签切换效果
2020/04/15 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
[00:14]护身甲盾
2019/03/06 DOTA
Python使用微信SDK实现的微信支付功能示例
2017/06/30 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
python 获取当前目录下的文件目录和文件名实例代码详解
2020/03/10 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
复核员上岗演讲稿
2014/01/05 职场文书
主持人婚宴答谢词
2014/01/28 职场文书
单位承诺书格式
2014/05/21 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
焦点访谈观后感
2015/06/11 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
Python Parser的用法
2021/05/12 Python
解析Redis Cluster原理
2021/06/21 Redis