专栏首页LaravelCodeYii2.0 RBAC 权限搭建以及多端配置

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

Yii2.0 RBAC 权限搭建

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

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

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

安装

composer create-project yiisoft/yii2-app-advanced advanced 2.0.14

生成默认用户表 User

php yii migrate

配置 RBAC

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

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
    ],
],

'components' => [
    'authManager' => [
        'class' => 'yii\rbac\DbManager',
    ],
]

生成对应的数据表

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

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

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

安装 yii2-admin

composer require mdmsoft/yii2-admin "~2.0"

生成数据表 menu

yii migrate --migrationPath=@mdm/admin/migrations

权限配置 打开 frontend\config\main.php 添加如下配置:

'modules' => [    
    'admin' => [        
        'class' => 'mdm\admin\Module',
        'layout' => 'left-menu', 
    ],
],
'aliases' => [
        '@mdm/admin' => '@vendor/mdmsoft/yii2-admin',
    ],
'as access' => [
    'class' => 'mdm\admin\components\AccessControl',
    'allowActions' => ['*'], // 后面对权限完善了以后,记得把*改回来!
],
'components' => [
    'authManager' => [
        'class' => 'yii\rbac\DbManager',
    ],
]

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

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

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

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

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

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

具体实现步骤:

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

php yii migrate/create create_admin_user_table

编辑 console\migrations\m****_create_admin_user_table.php

/**
 * {@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 ,我们在上方已经使用数据迁移将他创建了) 我们还使用 数据迁移的方式进行创建

php yii migrate/create create_admin_menu_table

编辑生成的文件

 /**
 * {@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 命令

php yii migrate

接下来生成 权限表,我们更改下common\config\main.phpauthManager 组件

'authManager' => [
    'class' => 'yii\rbac\DbManager',
    'itemTable' => 'admin_auth_item',
    'assignmentTable' => 'admin_auth_assignment',
    'itemChildTable'=> 'admin_auth_item_child',
    'ruleTable'=> 'admin_rule',
],

使用 migrate 生成权限表

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

接着 ,我们再把 common\config\main.phpauthManager 组件 还原

'authManager' => [
    'class' => 'yii\rbac\DbManager',
],

修改 backend\config\main.php

'modules' => [    
    'admin' => [        
        'class' => 'mdm\admin\Module',
        'layout' => 'left-menu',
        'controllerMap' => [
            'assignment' => [
                'class' => 'mdm\admin\controllers\AssignmentController',
                'userClassName' => 'backend\models\AdminUser', #注意你需要生成此模型 
            ],
        ],
    ],
],
'aliases' => [
        '@mdm/admin' => '@vendor/mdmsoft/yii2-admin',
    ],
'as access' => [
    'class' => 'mdm\admin\components\AccessControl',
    'allowActions' => ['*'], // 后面对权限完善了以后,记得把*改回来!
],
'components' => [
    'authManager' => [
        'class' => 'yii\rbac\DbManager',
        'itemTable' => 'admin_auth_item',
        'assignmentTable' => 'admin_auth_assignment',
        'itemChildTable'=> 'admin_auth_item_child',
        'ruleTable'=> 'admin_rule',
        "defaultRoles" => ["guest"],
    ],
]

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

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

<?php
return [
    'mdm.admin.configs' => [
        'menuTable' => 'admin_menu', 
    ],
];

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 解决 Laravel 项目跨域问题

    Access to XMLHttpRequest at 'http://youji.teavels.test/api/travels/show' from o...

    hedeqiang
  • Hyperf + uni-app 使用 EasyWechat 实现微信小程序登录和支付

    修改 SWOOLE_HOOK_FLAGS 编辑 bin/hyperf.php 文件

    hedeqiang
  • Laravel 5.6 新特性

    Laravel 5.6 已正式发布,该版本在 Laravel 5.5 的基础上继续进行优化,包括日志系统、单机任务调度、模型序列化优化、动态频率限制、广播频道类...

    hedeqiang
  • 【专知-Java Deeplearning4j深度学习教程04】使用CNN进行文本分类:图文+代码

    【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视...

    WZEARW
  • $_PUT?put数据获取

    我们经常使用$_GET和$_POST来进行服务器交互,但是我们有的时候不得不被逼使用$_PUT方法获取数据 当然,php中是没有$_PUT的,但是我们可以使用...

    苦咖啡
  • 【R语言经典实例6】对整个向量执行计算

    基本的数学运算符可以对向量中的元素进行逐个计算。许多其他的函数也能对向量元素逐个进行运算,并以向量的形式输出结果。

    统计学家
  • MRTG FOR WINDOWS 安装指南

    MRTG(Multi Router Traffic Grapher),通常讲是一个监控网络链路流量负载的开源软件,它可以从所有运行SNMP协议的设备上(包括服务...

    菩提树下的杨过
  • 虚拟化推动移动网络运营商的崛起

    网络功能虚拟化(NFV)和软件定义网络(SDN)的出现,逐渐降低了基础设施的成本并通过使用网络级云计算来实现日常运营,从而促进世界上最大的网络运营商的转变。 一...

    企鹅号小编
  • PhpStorm提示interpreter is not configured解决方法

    返回PhpStorm软件,右下角提示"interpreter is not configured Please configure PHP Interprete...

    德顺
  • geotrellis使用(四十)优雅的处理请求超过最大层级数据

    前言 要说清楚这个题目对我来说可能都不是一件简单的事情,我简单尝试。 研究 GIS 的人应该都清楚在 GIS 中最常用的技术是瓦片技术,无论是传统的栅格瓦片还是...

    魏守峰

扫码关注云+社区

领取腾讯云代金券