yii 使用DB實現rbac 權限控制

rbac
中文名稱:基於角色的權限控制
首先清楚 他有五張表php

用戶表
用戶角色表
角色表
角色權限表
權限表
//兩張表 能夠 存二進制mysql

實際操做中web

先說後臺sql

首先是建立權限和角色數組

而後是使用咱們網站的用戶表
給角色分配權限
給用戶分配角色yii2

前臺 :app

首先 根據咱們的用戶id 查詢出這我的都有什麼角色框架

接下來 跟據咱們的角色id 查出這些角色所擁有的權限。把這些權限寫到一個數組裏frontend

而後,獲取當前操做的控制器和方法名(TP框架裏函數是 CONTROLLER_NAME/ACTION_NAME) 而後判斷當前的操做是否是在該登陸用戶的權限組裏,若是在進入這個方法成功若是不在提示沒有該操做的權限
//具體的操做方法yii

首先咱們建立一個公共的控制器 叫作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層 由於文件較多 這裏就不一一列舉了 都是用的表單小部件

相關文章
相關標籤/搜索