yii 使用DB实现rbac 权限控制

本文详细介绍了如何在Yii2框架中通过DB实现RBAC(基于角色的权限控制),包括创建权限和角色、分配权限给角色、分配角色给用户、前端权限判断等步骤,并提到了基于权限的角色控制和组件加载配置。
摘要由CSDN通过智能技术生成

rbac
中文名称:基于角色的权限控制

先说后台

首先是创建权限和角色

然后是使用我们网站的用户表
给角色分配权限
给用户分配角色

前台 :

首先 根据我们的用户id 查询出这个人都有什么角色

接下来 跟据我们的角色id 查出这些角色所拥有的权限。把这些权限写到一个数组里

然后,获取当前操作的控制器和方法名(TP框架里函数是 CONTROLLER_NAME/ACTION_NAME) 然后判断当前的操作是不是在该登录用户的权限组里,如果在进入这个方法成功如果不在提示没有该操作的权限
//具体的操作方法

首先我们创建一个公共的控制器 叫做CommemController.php 让他继承我们的基类控制器 在这个公共的控制器里 写判断权限的方法。 然后把需要进行权限控制的控制器让它继承公共控制器 不需要的继承基类控制器
以上说的都是基于角色的权限控制
还有一种 基于权限的角色控制

yii2.0 中有两种权限控制方式

一种是基于 php的

一种是基于 db的
首先我们要有五张表
首先 我们要有一个登录存储用户信息的user表
表结构如下

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的rbac 是一个组件 有自带的剩余的表的表结构

具体位置 在 vendor/yiisoft/yii2/rbac/migrations/mysql。sql
到这里 我们的五张表 就弄完了

我们要想使用yii的rbac组件 需要先加载组件

在common/config/main-local.php 或者 main.php 添加下面一段话

'authManager' => [
'class' => 'yii\rbac\DbManager',
'itemTable' => 'auth_item',
'assignmentTable' => 'auth_assignment',
'itemChildTable' => 'auth_item_child',
],

接下来 创建权限和角色
先创建权限

这里我们使用的是文本框输入数据达到输入的目的的,表单小部件这部分我们略过

public function actionAddpower(){
	$data = Yii::$app->request->post();
	$power = $data['Rbac']['power'];
	$auth = Yii::$app->authManager;
	$createPost = $auth->createPermission($power);
	$createPost->description = '创建了 ' . $power . ' 权限';
	$auth->add($createPost);
	echo "创建权限成功 <a href='?r=rbac/createrole'>点我继续添加角色</a>";
}

然后创建角色

public function actionAddrole(){
	$data = Yii::$app->request->post();
	$roles = $data['Rbac']['role'];
	$auth = Yii::$app->authManager;
	$role = $auth->createRole($roles);
	$role->description = '创建了 ' . $roles . ' 角色';
	$auth->add($role);
	echo "创建角色成功 <a href='?r=rbac/rp'>点我给角色分配权限</a>";
}

给角色分配权限

public function actionDorp(){
	$data = Yii::$app->request->post();
	$roles = $data['Rbac']['role'];
	$powers = $data['Rbac']['power'];
	foreach($powers as $power){
	$auth = Yii::$app->authManager;
	$parent = $auth->createRole($roles);
	$child = $auth->createPermission($power);
	$auth->addChild($parent, $child);
	}
	echo "分配成功 <a href='?r=rbac/ur'>点我给用户分配角色</a>";
	}

给用户分配角色

public function actionDour(){
	$data = Yii::$app->request->post();
	$roles = $data['Rbac']['role'];
	$user = $data['Rbac']['user'];
	foreach($roles as $value){
		$auth = Yii::$app->authManager;
		$reader = $auth->createRole($value);
		$auth->assign($reader,$user);
	}
}

然后我们在我们需要做权限控制的控制器里 添加下边的方法就可以了

public function beforeAction($action)
{
	$action = Yii::$app->controller->action->id;
	if(\Yii::$app->user->can($action)){
		return true;
	}else{
		throw new \yii\web\UnauthorizedHttpException('对不起,您现在还没获此操作的权限');
	}
}

下边是完整的代码

Model层 Rbac.php

<?php
/**
* Created by PhpStorm.
* User: jinlei
* Date: 2017/5/12
* Time: 9:39
*/

namespace frontend\models;
use yii\base\Model;
use yii\widgets\ActiveForm;
use yii;
use db;

class Rbac extends Model
{
public $power;
public $role;
public $user;
public function rules(){
return[

];
}
static public function getrole(){
	$sql = 'select name from auth_item where type=1';
	$role = Yii::$app->db->createCommand($sql)->queryAll();
	
	return $role;
}
static public function getpower(){
	$sql = 'select name from auth_item where type=2';
	$power = Yii::$app->db->createCommand($sql)->queryAll();
	
	return $power;
}
static public function getuser(){
	$sql = 'select username,id from user';
	$user = Yii::$app->db->createCommand($sql)->queryAll();
	
	return $user;
}
static public function arrtostr($data){
	$arr = array();
	foreach($data as $value){
		$arr[$value['name']] = $value['name'];
	}
	
	return $arr;
}

static public function arrtouser($data){
	$arr = array();
	foreach($data as $value){
		$arr[$value['id']] = $value['username'];
	}
		return $arr;
	}
}

控制器层 RbacController.php

<?php
/**
* Created by PhpStorm.
* User: jinlei
* Date: 2017/5/12
* Time: 9:42
*/

namespace frontend\controllers;
use yii\web\Controller;
use frontend\models\Rbac;
use yii;

class RbacController extends Controller
{
public function actionCreatepower(){
	$model = new Rbac();
	return $this->render('createpower',['model'=>$model]);
}
public function actionAddpower(){
	$data = Yii::$app->request->post();
	$power = $data['Rbac']['power'];
	$auth = Yii::$app->authManager;
	$createPost = $auth->createPermission($power);
	$createPost->description = '创建了 ' . $power . ' 权限';
	$auth->add($createPost);
	echo "创建权限成功 <a href='?r=rbac/createrole'>点我继续添加角色</a>";
}
public function actionCreaterole(){
	$model = new Rbac();
	return $this->render('createrole',['model'=>$model]);
}
public function actionAddrole(){
	$data = Yii::$app->request->post();
	$roles = $data['Rbac']['role'];
	$auth = Yii::$app->authManager;
	$role = $auth->createRole($roles);
	$role->description = '创建了 ' . $roles . ' 角色';
	$auth->add($role);
	echo "创建角色成功 <a href='?r=rbac/rp'>点我给角色分配权限</a>";
	}
public function actionRp(){
	$role = Rbac::getrole();
	$power= Rbac::getpower();
	$roles = Rbac::arrtostr($role);
	$powers = Rbac::arrtostr($power);
	$model = new Rbac();
	return $this->render('rp',['model'=>$model,'role'=>$roles,'power'=>$powers]);
}
public function actionDorp(){
	$data = Yii::$app->request->post();
	$roles = $data['Rbac']['role'];
	$powers = $data['Rbac']['power'];
	foreach($powers as $power){
		$auth = Yii::$app->authManager;
		$parent = $auth->createRole($roles);
		$child = $auth->createPermission($power);
		$auth->addChild($parent, $child);
	}
	echo "分配成功 <a href='?r=rbac/ur'>点我给用户分配角色</a>";
}
public function actionUr(){
	$users = Rbac::getuser();
	$role = Rbac::getrole();
	$roles = Rbac::arrtostr($role);
	$users = Rbac::arrtouser($users);
	$model = new Rbac();
	return $this->render('ur',['model'=>$model,'role'=>$roles,'user'=>$users]);

}
public function actionDour(){
	$data = Yii::$app->request->post();
	$roles = $data['Rbac']['role'];
	$user = $data['Rbac']['user'];
	foreach($roles as $value){
		$auth = Yii::$app->authManager;
		$reader = $auth->createRole($value);
		$auth->assign($reader,$user);
	}
}
public function beforeAction($action)
{
	$action = Yii::$app->controller->action->id;
	if(\Yii::$app->user->can($action)){
		return true;
	}else{
		throw new \yii\web\UnauthorizedHttpException('对不起,您现在还没获此操作的权限');
	}
	}
}

view层 因为文件较多 这里就不一一列举了 都是用的表单小部件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值