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实现定时生成HTML网站首页实例代码
Nov 20 PHP
一个PHP的QRcode类与大家分享
Nov 13 PHP
ecshop 批量上传(加入自定义属性)
Mar 20 PHP
php mssql扩展SQL查询中文字段名解决方法
Oct 15 PHP
基于curl数据采集之正则处理函数get_matches的使用
Apr 28 PHP
php函数间的参数传递(值传递/引用传递)
Sep 23 PHP
php判断手机访问还是电脑访问示例分享
Jan 20 PHP
php中常见的sql攻击正则表达式汇总
Nov 06 PHP
PHP实现简单爬虫的方法
Jul 29 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 PHP
PHP MVC框架路由学习笔记
Mar 02 PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 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 adodb操作mysql数据库
2009/03/19 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
PHP 如何利用phpexcel导入数据库
2013/08/24 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
php闭包中使用use声明变量的作用域实例分析
2018/08/09 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
详解vue+css3做交互特效的方法
2017/11/20 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
vue 页面跳转的实现方式
2021/01/12 Vue.js
Python外星人入侵游戏编程完整版
2020/03/30 Python
浅谈python迭代器
2017/11/08 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
下列程序在32位linux或unix中的结果是什么
2015/01/26 面试题
车间组长岗位职责
2013/12/20 职场文书
党员民主评议自我评价
2014/10/20 职场文书
先进工作者推荐材料
2014/12/23 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
2016年暑期教师培训心得体会
2016/01/09 职场文书
Python多个MP4合成视频的实现方法
2021/07/16 Python
一文解答什么是MySQL的回表
2022/08/05 MySQL
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技