Yii2 的 RBAC(Role-Based Access Control 基于角色的访问控制)

博客 553次浏览 收藏

又再写,又需要温故而知新。今天主要关注它再数据库中创建的4张表

Yii2 的 RBAC(Role-Based Access Control,基于角色的访问控制)使用 DbManager(数据库方式)时,主要依赖 4 张表 来存储所有权限相关数据。


理解一个关键点:角色与权限都存放在 auth_item 这张表中,通过 type 字段区分

auth_item 表    权限、角色 ,同时存放 角色 和 权限 的基本信息 。 主要字段:

    name : 可以是 post.add  post.delete   或 admin  user

type :  2 是权限     1 是角色

    description: 这个描述 一定要有  不然时间长了 不知到这个是干什么的权限

所以创建这个表可以先插入角色数据,后插入权限数据。


auth_item_child 表      继承、包含关系表。  记录“谁包含谁” 角色包含权限、角色包含子角色

还是直接上个表数据举例说明  用于定义层次结构

parent      child  表中就这2个字段
user         admin.view
user        admin.add
user        admin.delete   #以上是用户user 的几个可用权限
admin         user         #这是admin 包含 user  也就等于admin也拥有了user的3个权限,或者说是admin继承了user
admin        admin.recycle 
admin         admin.restore
admin        admin.purge  #这三行是 给 admin角色添加了3个新的权限


auth_assignment    角色 分配/指派表   记录“哪个用户拥有哪个角色”

主要两个字段

    item_name 对应  auth_item 中的name (一般是type=1的角色)

    user_id 用户id

所以这个表只有在添加或注册用户的时候,根据用户的情况 是分配给什么角色。



auth_rule  定义业务规则  。用于定义更复杂的业务规则,即逻辑权限控制。

示例:用户只能编辑自己的文章

class AuthorRule extends \yii\rbac\Rule
{
    public $name = 'isAuthor';

    public function execute($user, $item, $params)
    {
        return isset($params['post']) ? $params['post']->created_by == $user : false;
    }
}

写入 auth_rule 表中的数据则是

namedataisAuthor序列化后的 rule 数据

这个后面了 再补充


贴个示例代码

<?php

namespace console\controllers;

use Yii;
use yii\console\Controller;
use yii\console\ExitCode;
use backend\models\AdminUser;


class AdminController extends Controller
{
    
    // 添加一个超级用户
    public function actionInit()
    {
        $admin = new AdminUser();
        $admin->username = 'admin';
        $admin->email = 'sino_cl@163.com';
        $admin->nickname = '超级管理员';
        $admin->setPassword('12345678');           // 或更安全的密码
        $admin->generateAuthKey();
        $admin->generatePasswordResetToken();    // 可选
        $admin->status = 10;
        $admin->save(false);

        $this->actionRbac();
        $this->setAdminAssign(1);
    }


    public function setAdminAssign($userid = 2)
    {

        // ── 这里开始分配角色 ──
        $auth = Yii::$app->authManager;
            
        // 方式A:分配单个固定角色(推荐新手用这个)
        
        if($userid == 1){
            $role = $auth->getRole('admin');           // 改成你实际创建的角色名
            // $role = $auth->getRole('author');
            // $role = $auth->getRole('member');
            $auth->assign($role, 1);      // 注意:第二个参数是用户ID(整数)
        }
        if($userid >= 2){
            $role = $auth->getRole('user');
            if ($role) {
                $auth->assign($role, $userid);
            }
        }
    }

    /**
     * 初始化 后台RBAC
     * 用法:php yii admin/rbac
     * 注意: 在执行这个之前需要先 做 数据迁移  php yii migrate --migrationPath=@yii/rbac/migrations
     */
    public function actionRbac()
    {
        // 在控制器中 配置 权限管理器
        /**
        Yii::$app->set('authManager', [
            'class' => 'yii\rbac\DbManager',
        ]);
        **/

        $auth = Yii::$app->authManager;

        // 清空旧数据(谨慎使用,开发期推荐)
        $auth->removeAll();

        // ---------- 后台用户管理权限 ----------
        $adminView = $auth->createPermission('admin.view');
        $adminView->description = '查看用户';
        $auth->add($adminView);

        $adminAdd = $auth->createPermission('admin.add');
        $adminAdd->description = '添加用户';
        $auth->add($adminAdd);

        $adminDelete = $auth->createPermission('admin.delete');
        $adminDelete->description = '删除用户到回收站';
        $auth->add($adminDelete);

        $adminRecycle = $auth->createPermission('admin.recycle');
        $adminRecycle->description = '用户回收站';
        $auth->add($adminRecycle);

        $adminRestore = $auth->createPermission('admin.restore');
        $adminRestore->description = '恢复用户';
        $auth->add($adminRestore);     

        $adminPurge = $auth->createPermission('admin.purge');
        $adminPurge->description = '彻底删除用户';
        $auth->add($adminPurge);


        // ---------- 角色 ----------

        $user = $auth->createRole('user');
        $user->description = '普通管理用户';
        $auth->add($user);

        $admin = $auth->createRole('admin');
        $admin->description = '超级管理员';
        $auth->add($admin);



        // ---------- 权限分配 ----------
        // user
        $auth->addChild($user, $adminView);
        $auth->addChild($user, $adminAdd);
        $auth->addChild($user, $adminDelete);                


        // admin 自动继承 user 并添加新权限
        $auth->addChild($admin, $user);
        $auth->addChild($admin, $adminRecycle);
        $auth->addChild($admin, $adminRestore);
        $auth->addChild($admin, $adminPurge);




        // ---------- 绑定管理员 ----------
        // ⚠️ 把 1 改成你自己的管理员用户 ID 添加用户
        // $auth->assign($admin, 1);
        // $auth->assign($user, 2);
        // 这里注释掉 是 让用户注册或初始化的时候 依据用户情况分配角色

        $this->stdout("后台 RBAC 初始化完成\n");
    }

    
}


评论

登录后可以发表评论与回复。

还没有评论,来做第一个发言的人。