Yii权限控制组件authManager使用思想RBAC

54 篇文章 2 订阅

0.思想

角色与权限表父子关系表
角色与权限表描述表
角色与用户对应表

如果要能对任何⽤户进⾏权限检查,需要调⽤yii\rbac\ManagerInterface::checkAccess()⽅法就可以检查权限了。

1.启用RBAC

在common/main.php里面进行启用

// 配置权限组件
   'authManager' => [
        'class' =>'yii\rbac\DbManager',
   ],

2.步骤

2.1建立数据表

方法一:利用migration进行建立

yii migrate --migrationPath=@yii/rbac/migrations

方法二:利用sql进行建立 

auth_assignment表示的是角色与用户id的关系

auth_item表示的是所有的角色与权限的表格(type为1Wie角色 为2则是权限)

auth_item_child表示的是角色与角色的父子关系   角色与权限的父子关系

auth_rule表示的是在权限之上的关系

2.2填充数据

用代码逻辑清晰  也可以直接在数据表格里面进行添加数据

<?php
use yii\db\Migration;

class m170124_084304_init_rbac extends Migration
{
    public function up()
    {
        $auth = Yii::$app->authManager;

        // 添加 "createPost" 权限
        $createPost = $auth->createPermission('createPost');
        $createPost->description = 'Create a post';
        $auth->add($createPost);

        // 添加 "updatePost" 权限
        $updatePost = $auth->createPermission('updatePost');
        $updatePost->description = 'Update post';
        $auth->add($updatePost);

        // 添加 "author" 角色并赋予 "createPost" 权限
        $author = $auth->createRole('author');
        $auth->add($author);
        $auth->addChild($author, $createPost);

        // 添加 "admin" 角色并赋予 "updatePost" 
		// 和 "author" 权限
        $admin = $auth->createRole('admin');
        $auth->add($admin);
        $auth->addChild($admin, $updatePost);
        $auth->addChild($admin, $author);

        // 为用户指派角色。其中 1 和 2 是由 IdentityInterface::getId() 返回的id
        // 通常在你的 User 模型中实现这个函数。
        $auth->assign($author, 2);
        $auth->assign($admin, 1);
    }
    
    public function down()
    {
        $auth = Yii::$app->authManager;

        $auth->removeAll();
    }
}


填充数据进行添加到数据表格中
yii rbac/init

3.分配角色

下面是利用代码进行分配的角色权限  也可以写一个页面进行分配权限角色

public function signup()
{
    if ($this->validate()) {
        $user = new User();
        $user->username = $this->username;
        $user->email = $this->email;
        $user->setPassword($this->password);
        $user->generateAuthKey();
        $user->save(false);

        // 增加了以下三行:
        $auth = \Yii::$app->authManager;
        $authorRole = $auth->getRole('author');
        $auth->assign($authorRole, $user->getId());

        return $user;
    }

    return null;
}

4.权限检查

if (\Yii::$app->user->can('createPost')) {
    // 
}

5.控制器

public function actionPrivilege($id)
    {
        if (!Yii::$app->user->can('gm', [], true)) {
            throw new ForbiddenHttpException('对不起,你没有这个权限');
        }

        //step1. 找出所有权限,提供给checkboxlist   用于显示所有的权限
        $allPrivileges = AuthItem::find()
            ->select(['name', 'description'])
            ->where(['type' => 1])
            ->orderBy('description')
            ->all();

        foreach ($allPrivileges as $pri) {
            $allPrivilegesArray[$pri->name] = $pri->description;
        }

        //step2. 当前用户的权限
        $AuthAssignments = AuthAssignment::find()
            ->select(['item_name'])
            ->where(['user_id' => $id])
            ->orderBy('item_name')
            ->all();

        //此处的数组是在把之前有的权限制作成了一个数组
        $AuthAssignmentsArray = array();

        foreach ($AuthAssignments as $AuthAssignment) {
            array_push($AuthAssignmentsArray, $AuthAssignment->item_name);
        }

        //step3. 从表单提交的数据,来更新AuthAssignment表,从而用户的角色发生变化
        if (isset($_POST['newPri'])) {
            AuthAssignment::deleteAll('user_id=:id', [':id' => $id]);

            $newPri = $_POST['newPri'];

            $arrlength = count($newPri);

            for ($x = 0; $x < $arrlength; $x++) {
                $aPri = new AuthAssignment();
                $aPri->item_name = $newPri[$x];
                $aPri->user_id = $id;
                $aPri->created_at = time();

                $aPri->save();
            }
            return $this->redirect(['index']);
        }

        //step4. 渲染checkBoxList表单
        return $this->render('privilege', ['id' => $id, 'AuthAssignmentArray' => $AuthAssignmentsArray,
            'allPrivilegesArray' => $allPrivilegesArray]);

    }

6.区分显示

前端页面可以利用php插入html代码进行显示不同的按钮页面

因为Yii::$app->user->can是全局性质的组件  可以进行检查!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值