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