yii 使用DB实现rbac 权限控制
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层 因为文件较多 这里就不一一列举了 都是用的表单小部件