## Yii2项目后台整合yii2-admin模块 [TOC] 参考自:[yii2-admin 插件使用简要教程](http://www.yiichina.com/tutorial/571)   [mdmsoft/yii2-admin](https://github.com/mdmsoft/yii2-admin)项目轻松整合到项目中进行RBAC权限控制,具体可以使用[参看文档](https://github.com/mdmsoft/yii2-admin/blob/master/docs/guide/configuration.md),在此做一个记录。 > 本演示针对yii2~advanced高级版。 ### 安装yii2 首先安装好**advanced**高级版的Yii2。 ### 配置数据库连接 创建`yii2_advanced`数据库,并授权用户。 ```sql create database yii2_advanced default charset utf8; grant all on yii2_advanced.* to yii2_advanced@localhost identified by 'my_yii2_advanced_password'; ``` 修改本地配置文件`<project>/common/config/main-local.php`内容,这里使用的mysql数据库,配置如下: ```php 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2_advanced', 'username' => 'yii2_advanced', 'password' => 'my_yii2_advanced_password', 'charset' => 'utf8', ], ``` ### 使用composer安装yii2-admin 安装yii2-admin之前,假定操作系统已经安装了[全局的composer](http://docs.phpcomposer.com/00-intro.html#Globally-on-OSX-via-homebrew) ```shell composer require mdmsoft/yii2-admin "~2.0" ``` ### 配置yii2-admin运行环境   因为仅将权限控制应用于后台backend模块,所以这里将配置写到`<project>/backend/config/main.php`文件里,依次小心添加如下内容。 ```php return [ 'modules' => [ 'admin' => [ 'class' => 'mdm\admin\Module', 'layout' => 'left-menu',//yii2-admin的导航菜单 ] ... ], ... 'components' => [ ... 'authManager' => [ 'class' => 'yii\rbac\DbManager', // 使用数据库管理配置文件 ] ], 'as access' => [ 'class' => 'mdm\admin\components\AccessControl', 'allowActions' => [ 'site/*',//允许访问的节点,可自行添加 'admin/*',//允许所有人访问admin节点及其子节点 ] ], ]; ``` ### 创建数据库表 #### 创建用户表和菜单表 这里通过命令行运行命令的方式,使用迁移文件进行数据库表的创建。 > 运行以下命令前请保证数据库中不存在相关表。 ```shell php yii migrate --migrationPath=@mdm/admin/migrations ``` > 上面的命令会在数据库创建`user`表和`menu`表。 #### RBAC相关表 这里有两种办法建立相应的表。 - 使用迁移命令 ```shell php yii migrate --migrationPath=@yii/rbac/migrations ``` > 如果想通过运行上面的命令得到相应表需要如下配置 > 在 `<project>/console/config/main.php` 中添加如下代码: > ```php > 'components' => [ > 'authManager' => [ > 'class' => 'yii\rbac\DbManager', > ], > ], > ``` > 关闭终端,重新打开终端执行上面的迁移命令使迁移生效。 - 执行SQL语句 其中sql文件保存在`<project>/vendor/yiisoft/yii2/rbac/migrations/schema-mysql.sql`里,复制到MySQL的客户端工具中执行即可。 至此完成安装。 通过访问地址栏`http://localhost/yii2/advanced/backend/web/index.php?r=admin`查看效果,如下: ![](https://box.kancloud.cn/4aa52f9b0dd756e89809b761ae86605a_1281x783.png) ### 配置授权demo   以一个自定义的节点`goods`为例,节点`goods`下共有`index`-商品列表,`view`-查看商品,`create`-创建商品,`update`-更新商品,`delete`-删除商品这五个子节点,可以通过gii生成这些代码。 配置目标: - 未登录用户仅能访问`index`节点 - 一般登录用户能访问`index`,`view`,`create`三个节点 - 管理员能访问所有节点 #### 添加可分配权限列表 点击`yii2-admin`**路由列表页**,点击可用输入框后面的刷新图标将列出当前网站所有可用的路由列表,新增`goods`各节点路由表添加至右侧可分配路由列表中,如下。 ![](https://box.kancloud.cn/2690fff034e56bdacb3737b6811ff802_1097x557.png) #### 添加权限 点击`yii2-admin`**权限列表**=>**新增权限**,填好名称提交后,添加对应的路由规则即可,如下。 ![](https://box.kancloud.cn/ec7f8cc16093c9caddf47c4e68d722d6_1191x384.png) 填好**名称**与**描述**后提交,进入到如下页面,选中相关路由点击加入到右边。 ![](https://box.kancloud.cn/c3fae4926dc71ff0723ec81420c6e1e4_1106x710.png) > 左侧的可用列表中除了路由列表还有已经添加了的权限列表,即一个权限可以包含另一个权限。 #### 添加角色并分配权限   点击`yii2-admin`**角色列表**=>**新增角色**,分别添加管理员、一般用户、未登录用户,并分配权限,如下。 ![](https://box.kancloud.cn/dbeff545d6c867eec4d978c44ef700dd_1172x377.png) 填好**名称**与**描述**后提交,进入到如下页面,选中相关权限点击加入到右边。 ![](https://box.kancloud.cn/59cb3980fdf6b667a499ca982b629f5a_1086x689.png) #### 分配角色 点击`yii2-admin`**分配**界面列出来的用户名是当前系统中已注册的用户,这里注册一个admin和test进行测试。其中admin为管理员角色,test为一般用户。 ![](https://box.kancloud.cn/05511351553bbaed591caabd7f6d0ebc_1151x683.png) 单击图上的‘小眼睛’按钮,进行分配角色,如下: ![](https://box.kancloud.cn/b0f63af9908fbd9b0719dae4a2beb382_1083x492.png) > 按需要将`test用户`也加入到一般用户的角色组中,给予相应的权限。 1. 以管理员身份登录时,可进行所有操作。符合预期。 2. 但是如果不登录,在访问goods首页时会跳转到登录页面。预期结果是未登录时能访问goods首页,就是说当前系统默认不认可我们配置给未登录用户的权限。 只需要在配置文件中加一行指定默认规则的代码即可,如下: ```php 'authManager'=> [ 'class' => 'yii\rbac\DbManager', 'defaultRoles' => ['未登录用户'],//添加此行代码,指定默认规则为 '未登录用户' ], ``` 经过上面的配置,在用户未登录时再访问`goods/index`节点就能正常显示了,点别的操作如`goods/update`时会跳到登录页面,因为上面配置了**未登录角色只能访问`/goods/index`节点**,未登录时仅有访问首页的权限。 > 另外除了在`authManager`中配置默认权限,在`as access`中也可以配置允许所有人访问的节点。 ```php 'as access' => [ 'allowActions' => [//下面列出的节点,所有人都可以访问,针对未登录用户的配置也可以移至这里 'admin/*', 'site/*', 'gii/*', ] ], ``` 至此,关于yii2-admin相关的权限管理告一段落,然而并没有使用到menu表对后台菜单进行权限控制,以及rule表精细化控制权限(可[参考这里](http://www.manks.top/yii2_rbac_rule.html))。通过RBAC集成AdminLTE后台主题对菜单进行控制。