Yii2.0 RBAC 权限搭建以及多端配置

2019-12-17 22:07:13 浏览数 (1)

Yii2.0 RBAC 权限搭建

基于角色的存取控制 (RBAC)

基于角色的存取控制 (RBAC) 提供了一个简单而强大的集中式存取控制机制。 详细的关于 RBAC 和诸多传统的存取控制方案对比的详情,请参阅 Wikipedia。

具体请参阅 基于角色的存取控制

安装

代码语言:javascript复制
composer create-project yiisoft/yii2-app-advanced advanced 2.0.14

生成默认用户表 User

代码语言:javascript复制
php yii migrate

配置 RBAC

这里 我们使用 DbManager.以高级版为例:在 commonconfigmain.php 中 配置 authManager

代码语言:javascript复制
'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
    ],
],

'components' => [
    'authManager' => [
        'class' => 'yiirbacDbManager',
    ],
]

生成对应的数据表

代码语言:javascript复制
php yii migrate --migrationPath=@yii/rbac/migrations

执行以上命令会生成 4 张数据表

  • itemTable: 该表存放授权条目(译者注:即角色和权限)。默认表名为 「auth_item」 。
  • itemChildTable: 该表存放授权条目的层次关系。默认表名为 「auth_item_child」。
  • assignmentTable: 该表存放授权条目对用户的指派情况。默认表名为「auth_assignment」。
  • ruleTable: 该表存放规则。默认表名为「auth_rule」 。

安装 yii2-admin

代码语言:javascript复制
composer require mdmsoft/yii2-admin "~2.0"

生成数据表 menu

代码语言:javascript复制
yii migrate --migrationPath=@mdm/admin/migrations

权限配置 打开 frontendconfigmain.php 添加如下配置:

代码语言:javascript复制
'modules' => [    
    'admin' => [        
        'class' => 'mdmadminModule',
        'layout' => 'left-menu', 
    ],
],
'aliases' => [
        '@mdm/admin' => '@vendor/mdmsoft/yii2-admin',
    ],
'as access' => [
    'class' => 'mdmadmincomponentsAccessControl',
    'allowActions' => ['*'], // 后面对权限完善了以后,记得把*改回来!
],
'components' => [
    'authManager' => [
        'class' => 'yiirbacDbManager',
    ],
]

好了,以上就完成 RBAC 的配置工作,并且可以食用啦

访问网址 http://localhost/frontend/admin

接下来谈谈 多个客户端如何配置 RBAC

什么意思呢? 业务场景是:假如你一个应用。并且该应用有多个管理端, backendfrontendapi,或者你还有其他客户端。每一个可客户端对应不同的认证类,不同的用户表,那么你的权限该如何控制呢?

我的第一想法是:在原有权限表的基础上进行操作。但最后想想还是算了......

那么第二种,我可不可以把权限表完全独立呢?比如 admin 是一套,api 是一套。答案是可行的。但是代价是数据库会多 5 张表。

具体实现步骤:

我们把 backend 目录 作为 后台管理, 我们先生成 admin_user 用户表

代码语言:javascript复制
php yii migrate/create create_admin_user_table

编辑 consolemigrationsm****_create_admin_user_table.php

代码语言:javascript复制
/**
 * {@inheritdoc}
 */
public function safeUp()
{
    $this->createTable('admin_user', [
        'id' => $this->primaryKey(),
        'username' => $this->string()->notNull()->unique(),
        'auth_key' => $this->string(32)->notNull(),
        'password_hash' => $this->string()->notNull(),
        'password_reset_token' => $this->string()->unique(),
        'email' => $this->string()->notNull()->unique(),
        'status' => $this->smallInteger()->notNull()->defaultValue(10),
        'created_at' => $this->integer()->notNull(),
        'updated_at' => $this->integer()->notNull(),
    ]);
}

/**
 * {@inheritdoc}
 */
public function safeDown()
{
    $this->dropTable('admin_user');
}

生成 admin_menu 菜单表(默认是 menu ,我们在上方已经使用数据迁移将他创建了) 我们还使用 数据迁移的方式进行创建

代码语言:javascript复制
php yii migrate/create create_admin_menu_table

编辑生成的文件

代码语言:javascript复制
 /**
 * {@inheritdoc}
 */
public function safeUp()
{
    $this->createTable('admin_menu', [
        'id' => $this->primaryKey(),
        'name' => $this->string(128),
        'account' => $this->string(128),
        'parent' => $this->string(11),
        'route' => $this->string(256),
        'order' => $this->integer(),
        'data' => $this->text(),

    ]);
}

/**
 * {@inheritdoc}
 */
public function safeDown()
{
    $this->dropTable('admin_auth');
}

执行 migrate 命令

代码语言:javascript复制
php yii migrate

接下来生成 权限表,我们更改下commonconfigmain.phpauthManager 组件

代码语言:javascript复制
'authManager' => [
    'class' => 'yiirbacDbManager',
    'itemTable' => 'admin_auth_item',
    'assignmentTable' => 'admin_auth_assignment',
    'itemChildTable'=> 'admin_auth_item_child',
    'ruleTable'=> 'admin_rule',
],

使用 migrate 生成权限表

代码语言:javascript复制
php yii migrate --migrationPath=@yii/rbac/migrations

接着 ,我们再把 commonconfigmain.phpauthManager 组件 还原

代码语言:javascript复制
'authManager' => [
    'class' => 'yiirbacDbManager',
],

修改 backendconfigmain.php

代码语言:javascript复制
'modules' => [    
    'admin' => [        
        'class' => 'mdmadminModule',
        'layout' => 'left-menu',
        'controllerMap' => [
            'assignment' => [
                'class' => 'mdmadmincontrollersAssignmentController',
                'userClassName' => 'backendmodelsAdminUser', #注意你需要生成此模型 
            ],
        ],
    ],
],
'aliases' => [
        '@mdm/admin' => '@vendor/mdmsoft/yii2-admin',
    ],
'as access' => [
    'class' => 'mdmadmincomponentsAccessControl',
    'allowActions' => ['*'], // 后面对权限完善了以后,记得把*改回来!
],
'components' => [
    'authManager' => [
        'class' => 'yiirbacDbManager',
        'itemTable' => 'admin_auth_item',
        'assignmentTable' => 'admin_auth_assignment',
        'itemChildTable'=> 'admin_auth_item_child',
        'ruleTable'=> 'admin_rule',
        "defaultRoles" => ["guest"],
    ],
]

注意你需要自己生成对应的 AdminUser 模型类位置位于 backendmodelsAdminUser.php

好了 还有最重要的一步需要设置,修改 backendconfigparams-local.php

代码语言:javascript复制
<?php
return [
    'mdm.admin.configs' => [
        'menuTable' => 'admin_menu', 
    ],
];

这样就完全独立于默认的权限表了 访问 http://localhost/backend/admin

以上就是Yii2.0 RBAC 权限的配置搭建。并没有教你如何使用,这方面的东西网上有很多,可以自行查阅。

灵感来源 我在 YiiChina 发布的一个问答: Yii2.0 如何实现多端RBAC权限管理

0 人点赞