1、安装yii2高级版

   composer create-project --prefer-dist yiisoft/yii2-app-advanced .

2、安装并AdminLTE后台模板 https://github.com/dmstr/yii2-adminlte-asset

注:为了更好的管理页面模板,将vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app目录拷贝到backend/目录下,重命名为views_adminlte,并将backend/config/main.php文件中的components里面的view项改为

1
2
3
4
5
6
7
   'view' => [
     'theme' => [
        'pathMap' => [
          '@app/views' => '@backend/views_adminlte'
        ],
     ],
   ]

3、下载安装 yii2-admin https://github.com/mdmsoft/yii2-admin,安装好了会在vendor目录下面看到 mdmsoft目录

打开backend/config/main.php修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    'modules' => [ 
        'admin' => [ 
            'class' => 'mdm\admin\Module', 
        ],
    ],
    'aliases' => [ 
        '@mdm/admin' => '@vendor/mdmsoft/yii2-admin',
    ],
    'components' => [   // 这里必须添加authManager配置项
        … 
        //components数组中加入authManager组件,有PhpManager和DbManager两种方式, 
        //PhpManager将权限关系保存在文件里,这里使用的是DbManager方式,将权限关系保存在数据库. 
        'authManager' => [ 
            'class' => 'yii\rbac\DbManager', 
            'defaultRoles' => ['guest'], 
        ], 
        …
    ],
    // 严重警告!!!as access位置不要添加错了,已经不少同学都掉坑里了!!!
    'as access' => [
        'class' => 'mdm\admin\components\AccessControl',
        'allowActions' => [
            //这里是允许访问的action
            //controller/action
            //暂时将允许访问的action设置为'*',不然访问页面会提示403(没有权限),后面对权限完善以后,再改回来
            '*' 
        ]
    ],

4、配置数据库

4.1 配置数据库连接

修改common/config/main-local.php,配置前缀为yii_(‘tablePrefix’ => ‘yii_’) 实际项目中本地的数据库往往跟线上数据库不一致,

我们这里配置到main-local.php就可以了,产品上线后,我们可以使用git或者svn忽略掉main-local.php,线上直接部署。

4.2 创建yii_user和yii_menu表

说明:yii_user表和yii_menu(注意外键)表的创建可以参考我们后面下载的组件yii2-admin里面的sql,具体目录位于vendor\mdmsoft\yii2-admin\migrations\schema-mysql.sql

4.3 创建权限控制所需要的数据表(注意前缀)

打开 vendor/yiisoft/yii2/rbac/migrations/schema-mysql.sql 文件,依次创建数据表(注意修改表前缀)

auth_assignment,auth_item_child,auth_item,auth_rule

5、前台注册帐号(后面做为超级管理员),然后登录后台

注1:前台注册时可能会提示verification_key不存在。解决方法:在yii_user表中加入verification_key字段

注2:后台登录时会提示‘用户名或密码错误’。解决方法:把yii_user表中该条记录的status字段值改为10

ps:这时候可以测试下第3步中配置的’as access’项,把’*‘去掉,访问页面如果显示403,即权限配置是有效的

6、配置下简短路由

backend/config/main.php文件的compontents加上下面的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    'urlManager' => [ 
        //用于表明urlManager是否启用URL美化功能,在Yii1.1中称为path格式URL, 
        // Yii2.0中改称美化。 
        // 默认不启用。但实际使用中,特别是产品环境,一般都会启用。 
        'enablePrettyUrl' => true, 
        // 是否启用严格解析,如启用严格解析,要求当前请求应至少匹配1个路由规则, 
        // 否则认为是无效路由。 
        // 这个选项仅在 enablePrettyUrl 启用后才有效。 
        'enableStrictParsing' => false, 
        // 是否在URL中显示入口脚本。是对美化功能的进一步补充。 
        'showScriptName' => false, 
        // 指定续接在URL后面的一个后缀,如 .html 之类的。仅在 enablePrettyUrl 启用时有效。 
        'suffix' => '', 
        'rules' => [ 
            "<controller:\w+>/<id:\d+>"=>"<controller>/view", 
            "<controller:\w+>/<action:\w+>"=>"<controller>/<action>" 
        ],
    ],

接下来在项目的根目录 backend/web下面创建.htaccess文件并添加如下内容,这个文件你都创建不下来,看来是真需要再磨练磨练哦

1
2
3
4
5
6
7
8
    Options +FollowSymLinks
    IndexIgnore */*
    RewriteEngine on
    # if a directory or a file exists, use it directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # otherwise forward it to index.php
    RewriteRule . index.php

当然,你的apache必须要开启rewrite模块。 下面我们访问下gii模块测试下 {$site_url}/backend/web/gii,校验是可以的。

7、实现权限控制(思路:先添加路由,然后添加权限名称,后再对角色或个人进行权限的独立分配)

实例1.以‘超级管理员权限’为例,超级管理员可以在后台看到 小工具(包含gii和debug两个子菜单) 和 权限管理(包含路由、权限、角色、分配、菜单、规则) 这两个子菜单,而其它管理员看不到,具体步骤如下:

(1)修改left.php文件,将已有的菜单代码删除,然后加入以下代码,

1
2
3
4
5
6
7
8
9
10
11
    最上方加上
        <?php use mdm\admin\components\MenuHelper; ?>
    下方加上
        <?= dmstr\widgets\Menu::widget(
            [
                "encodeLabels" => false,
                "options" => ['class' => 'sidebar-menu tree', 'data-widget'=> 'tree'],
                "items" => MenuHelper::getAssignedMenu(Yii::$app->user->id),
            ]
         );
        ?>

(2)访问路由页面{$site_url}/admin/route,把左侧路由都选中,然后移到右侧

(3)访问权限页面{$site_url}/admin/permission,创建权限(名称:超级管理),点击创建按钮后,跳到权限分配页面,为该权限分配相应的路由,这里只移动‘/*’就可以了,代表所有路由的权限

(4)访问角色页面{$site_url}/admin/role,创建角色(名称:超级管理员),点击创建按钮后,跳到角色权限分配页面,这里只为其分配‘超级管理’的permission即可

(5)访问分配页面{$site_url}/admin/assignment,会显示user表中的所有用户,可以进行搜索,点击相应用户左边的view按钮,为其分配‘超级管理员’角色,只移动‘roles’,不用移动‘permission’

(6)访问菜单页面{$site_url}/admin/menu,创建‘权限管理’与‘小工具’菜单及其子菜单,只创建一级菜单时,并不会显示在左侧,创建子菜单后,就可以显示了 添加或编辑菜单时,父菜单和路由的输入框会自动弹出联想框,如果联想框不展示或位置不对,一般就是Jquery UI 和 jquery 3.0 的版本兼容问题(f.getClientRects is not a function) 解决方案:

1
2
3
4
5
6
7
8
9
    在common/config/main.php文件的components配置项中,加入
        'assetManager' => [ 
            'assetMap' => [ 
                'jquery.js' => 'https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js', 
                // 'jquery.min.js' => 'https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js',
                // 'jquery.js' => '@web/js/jquery/jquery.js',
                // 'jquery.min.js' => '@web/js/jquery/jquery.js', 
            ],
        ]

(7)去掉’as access’中’*‘,检查下是否还都可以正常访问。同时也可以前台创建一个新用户,用新用户登录后台,看是否访问后台所有页面都出现403错误