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 SQL防注入代码集合
Apr 25 PHP
PHP实现MySQL更新记录的代码
Jun 07 PHP
用PHP实现的四则运算表达式计算实现代码
Aug 02 PHP
深入解析Session是否必须依赖Cookie
Aug 02 PHP
浅谈Eclipse PDT调试PHP程序
Jun 09 PHP
学习php开源项目的源码指南
Dec 21 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
Mar 05 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
Jun 10 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 PHP
php TP5框架生成二维码链接
Apr 01 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
php解析字符串里所有URL地址的方法
2015/04/03 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
js有关元素内容操作小结
2011/12/20 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
vue实现分页栏效果
2019/06/28 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
python实现的分层随机抽样案例
2020/02/25 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
Python ORM框架Peewee用法详解
2020/04/29 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
CSS+jQuery+PHP+MySQL实现的在线答题功能
2015/04/25 HTML / CSS
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
DataList 能否分页,请问如何实现?
2015/05/03 面试题
社区文化建设方案
2014/05/02 职场文书
小学教师求职信范文
2015/03/20 职场文书
保研导师推荐信
2015/03/25 职场文书
签约仪式致辞
2015/07/30 职场文书
民事纠纷协议书
2016/03/23 职场文书
演讲开头怎么书写?
2019/08/06 职场文书
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电