## 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
```

這時如果正確執行可以看到類似上面的結果,并且可以使用客戶端連接工具連接到數據庫去查看遷移的效果。
#### 訪問前臺frontend模塊注冊用戶

注冊成功后,右上角會顯示登陸的狀態,在接下來的步驟中會用到這個注冊的用戶

### 利用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`對應的文件。
訪問后臺地址得到如下效果:

### 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模塊測試下,如下:

#### 創建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'],
],
],
```

- 開始
- 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上傳插件