• 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 bacDbManager’,
    ‘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 yiiwebUnauthorizedHttpException(‘对不起,您现在还没获此操作的权限’);
    }
    }
    下边是完整的代码

    Model层 Rbac.php

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

    namespace frontendmodels;
    use yiiaseModel;
    use yiiwidgetsActiveForm;
    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 frontendcontrollers;
    use yiiwebController;
    use frontendmodelsRbac;
    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 yiiwebUnauthorizedHttpException(‘对不起,您现在还没获此操作的权限’);
    }
    }
    }
    view层 因为文件较多 这里就不一一列举了 都是用的表单小部件

  • 相关阅读:
    Java Math 取整的方式
    Java final 关键词修饰类、方法、变量
    Android Activity 开发常用技巧整理
    Java override 和 overload 的区别
    Android TextView 常用技巧
    Android Adb 常用命令
    Android 实现应用升级方案(暨第三方自动升级服务无法使用后的解决方案)
    Git 常用命令
    Android 常见Crash Log汇总
    Java Annotation 总结
  • 原文地址:https://www.cnblogs.com/cjymuyang/p/9448728.html
Copyright © 2020-2023  润新知