## Yii2中使用yii2-admin搭建RBAC权限控制
[TOC]
### 安装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',
],
```
### 创建后台用户数据表
#### 修改迁移文件
修改数据迁移文件`<project>/console/migrations/m130524_201442_init.php`,内容如下:
```php
public function up()
{
$tableOptions = null;
if ($this->db->driverName === 'mysql') {
// http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
}
$this->createTable('{{%user}}', [
'id' => $this->primaryKey()->comment('自增ID'),
'username' => $this->string()->notNull()->unique()->comment('用户名'),
'auth_key' => $this->string(32)->notNull()->comment('自动登陆key'),
'password_hash' => $this->string()->notNull()->comment('加密密码'),
'password_reset_token' => $this->string()->unique()->comment('重置密码token'),
'email' => $this->string()->notNull()->unique()->comment('邮箱'),
'role'=>$this->smallInteger()->notNull()->defaultValue(10)->comment('角色等级'),
'status' => $this->smallInteger()->notNull()->defaultValue(10)->comment('用户状态'),
'created_at' => $this->integer()->notNull()->comment('创建时间'),
'updated_at' => $this->integer()->notNull()->comment('更新时间'),
], $tableOptions);
}
```
#### 执行数据库迁移
```shell
php yii migrate
```
![](https://box.kancloud.cn/63b1f960b355016ce407db261747084b_554x405.png)
这时如果正确执行可以看到类似上面的结果,并且可以使用客户端连接工具连接到数据库去查看迁移的效果。
#### 访问前台frontend模块注册用户
![](https://box.kancloud.cn/d4dfeba12af0ca610d68c0ca2695e12a_394x52.png)
注册成功后,右上角会显示登陆的状态,在接下来的步骤中会用到这个注册的用户
![](https://box.kancloud.cn/0bf9acf985225d6379a2d44f7f9a7bfa_459x52.png)
### 利用AdminLTE渲染后台模板
后台的模板这里采用[ AdminLTE](https://packagist.org/packages/dmstr/yii2-adminlte-asset#2.3.0)(Backend theme for Yii2 Framework)
#### 安装AdminLTE
可以参考[GitHub地址](https://github.com/dmstr/yii2-adminlte-asset),也可以参考之前写的一个[总结地址](http://blog.webfsd.com/article-214.html)进行安装。
#### yii2配置整合AdminLTE
建议拷贝`<project>/vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app`目录下的`layouts`和`site`目录拷贝并覆盖掉`<project>/backend/views/`目录下的`lauouts`和`site`对应的文件。
访问后台地址得到如下效果:
![](https://box.kancloud.cn/9b06bc704a0bc8497ee14b0c38743d39_1527x733.png)
### RBAC实现后台的权限控制
#### 配置简短路由
`<project>/backend/config/main.php`文件的`compontents`数组里加上下面的配置:
```php
"urlManager" => [
"enablePrettyUrl" => true,
"enableStrictParsing" => false,
"showScriptName" => false,
"suffix" => "",
"rules" => [
"<controller:\w+>/<id:\d+>"=>"<controller>/view",
"<controller:\w+>/<action:\w+>"=>"<controller>/<action>"
],
],
```
然后在项目的根目录 `<project>/backend/web`下面创建`.htaccess`文件并添加如下内容
```
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
```
> Apache服务器必须开启**rewrite_model**模块
访问gii模块测试下,如下:
![](https://box.kancloud.cn/c6337105a4cdc38d5bdef917dc629fa6_1532x754.png)
#### 创建RBAC相关表
建表语句存放在`<project>/vendor/yiisoft/yii2/rbac/migrations/schema-mysql.sql`文件中,在MySQL数据库中执行分别得到`auth_assignment` `auth_item_child` `auth_item`和`auth_rule`四个表。
另外我们需要创建一个后台菜单表。
```sql
CREATE TABLE `menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(128) NOT NULL,
`parent` int(11) DEFAULT NULL,
`route` varchar(256) DEFAULT NULL,
`order` int(11) DEFAULT NULL,
`data` text,
PRIMARY KEY (`id`),
KEY `parent` (`parent`),
CONSTRAINT `menu_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `menu` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
以上建表语句也可以使用`migration`进行迁移版本控制。
### 下载并安装 yii2-admin
安装步骤参见[GitHub地址](https://github.com/mdmsoft/yii2-admin)
#### 权限相关配置
修改`<project>/backend/config/main.php`中的内容:
```php
"modules" => [
"admin" => [
"class" => "mdm\admin\Module",
],
],
"aliases" => [
"@mdm/admin" => "@vendor/mdmsoft/yii2-admin",
],
//这里必须添加authManager配置项
"components" => [
"authManager" => [
"class" => 'yii\rbac\DbManager',
"defaultRoles" => ["guest"],
],
],
'as access' => [
'class' => 'mdm\admin\components\AccessControl',
'allowActions' => ['*'], // 后面对权限完善了以后,记得把*改回来!
]
```
[TOC]
#### 修改左侧菜单
模板文件在`<project>/backend/views/layouts/left.php`,在`items`数组中加入如下代码:
```php
[
'label' => '权限管理',
'icon' => 'fa fa-circle-o',
'url' => 'javascript:;',
'items' => [
['label' => '路由管理', 'icon' => 'fa fa-circle-o', 'url' => '/admin/route'],
['label' => '权限管理', 'icon' => 'fa fa-circle-o', 'url' => '/admin/permission'],
['label' => '角色管理', 'icon' => 'fa fa-circle-o', 'url' => '/admin/role'],
['label' => '用户与角色', 'icon' => 'fa fa-circle-o', 'url' => '/admin/assignment'],
['label' => '菜单管理', 'icon' => 'fa fa-circle-o', 'url' => '/admin/menu'],
],
],
```
![](https://box.kancloud.cn/b0ff6ea61e1c07b0fadf02a48d773ddd_1538x634.png)
- 开始
- Yii2开发小技巧
- Yii2使用不同的方式进行邮件发送逻辑处理
- Yii2 Serialization of 'Closure' is not allowed 错误
- Yii创建应用
- Yii应用结构和流程
- Yii的路径别名
- Yii的请求
- Yii的响应
- Sessions 和 Cookies
- Yii自定义全局工具函数
- Yii2模型
- Yii2视图
- Yii2控制器
- 大数据节省内存处理
- 关联查询hasMany、hasOne
- Yii2 URL地址美化
- Yii2整合AdminLTE后台主题
- Yii2模型中的场景
- Yii2中的RBAC
- Yii2项目后台整合yii2-admin模块
- RBAC集成AdminLTE后台主题对菜单进行控制
- Yii2自定义Gii模板
- 修复AdminLTE引用外部字体文件导致访问变慢的情况
- Yii2事件简单使用
- Yii2模型事件
- Yii2使用GridView新增操作按钮
- Yii2向loyout模板文件中传值
- Yii2数据缓存
- Yii2缓存
- Yii2数据缓存之增删改查
- Yii2拓展
- Yii2日期时间插件-datetimepicker
- kartik-v/yii2-widget-fileinput上传插件