koko 2015-11-13 10:42:07 98497次浏览 49条评论 101 25 0

yii2的访问权限默认是由自带的rbac组件在管理,需要自己编写相应的规则去实现权限管理,无图形界面。
yii2-admin是将rbac的管理可视化,只需要点几下鼠标就能设置好简单的规则。

本教程中软件版本及链接:yii2(v2.06,使用高级模板),yii2-admin(2.0)
yii2:https://github.com/yiisoft/yii2
yii2-admin:https://github.com/mdmsoft/yii2-admin
本文未涉及自定义规则和yii2-admin菜单
假定你已经安装好了yii2,且数据库中创建了user表。具体安装步骤可见此文档

使用composer安装yii2-admin
非windows环境下:

php composer.phar require mdmsoft/yii2-admin "~2.0"
php composer.phar update

Windows下:

composer require mdmsoft/yii2-admin "~2.0"
composer update

国内网络环境复杂,有可能安装时间较长。如果长时间无响应,可终止命令重试。

配置yii2-admin运行环境

注意:如果将yii2-admin配置在common目录下是全局生效,会导致控制台(console)下命令报错。

因为仅将权限控制应用于frontend模块,所以将配置写到frontend目录下。
配置文件:frontend\config\main.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节点及其子节点
        ]
    ],
];

创建相应的数据库表
在控制台中输入以下命令:

yii migrate --migrationPath=@mdm/admin/migrations
yii migrate --migrationPath=@yii/rbac/migrations

安装到此完成。
访问http#//localhost/path/to/index.php?r=admin可以看到yii2-admin的管理界面。效果如下图。

注:网址需要修改成你网站首页的实际地址。

配置访问权限示例
以节点terms(一个自定义的节点)为例,节点terms下共有index,view,create,update,delete五个子节点。
配置目标:
未登录用户仅能访问index节点
一般登录用户能访问index,view,create三个节点
管理员能访问所有节点

步骤一:添加可分配列表
打开yii2-admin路由列表页,点击可用输入框后面的刷新图标将列出当前网站所有可用的路由列表,选中terms各节点路由表添加至右侧可分配路由列表中。

步骤二:添加权限
权限列表=>新增权限,填好名称提交后,添加对应的路由规则即可。

可用列表中除了路由列表还有已经添加了的权限列表,一个权限可以包含另一个权限。

步骤三:添加角色
角色列表=》新增角色,分别添加管理员、一般用户、未登录用户,将对应的权限分配给角色。

步骤四:分配角色

分配界面列出来的用户名是当前系统中已注册的用户。现注册了admin和user账号用于演示。

点击账号后边的眼睛图案,进行权限分配。

按需要,给予相应的权限。

步骤五:配置网站默认访问权限
上面四步配置完成后,我们访问terms各节点测试结果:
以一般用户身份登录时,可以浏览、添加信息,要更新、删除信息时会提示无权操作。符合预期。

以管理员身份登录时,可进行所有操作。符合预期。
但是如果不登录,在访问terms首页时会跳转到登录页面。预期结果是未登录时能访问terms首页。
就是说当前系统默认不认可我们配置给未登录用户的权限。
只需要在配置文件中加一行指定默认规则的代码即可:

        'authManager'=> [
            'class' => 'yii\rbac\DbManager',
            'defaultRoles' => ['未登录用户'],//添加此行代码,指定默认规则为 '未登录用户'
        ],

未登录时再访问terms/index节点就能正常显示了,点别的操作时会跳到登录页面,因为未登录时仅有访问首页的权限。

除了在authManager中配置默认权限,在as access中也可以配置允许所有人访问的节点。

    'as access' => [
        'allowActions' => [//下面列出的节点,所有人都可以访问,针对未登录用户的配置也可以移至这里
            'admin/*',
            'site/*',
            ]
    ]

如果大家需要,空了再介绍下自定义规则和yii2-admin的菜单的应用。

原文链接:http://www.yiichina.com/tutorial/571
本文旨在介绍yii2-admin的基本用法,并非是最简洁的用法。如有不足之处,还请指正。

觉得很赞
  • 评论于 2015-11-13 15:26 举报

    呵呵 感谢koko啊

  • 评论于 2015-11-20 12:24 举报

    謝謝,但是圖片看不到了

    2 条回复
    评论于 2015-11-20 12:41 回复

    http://wlzyan.blog.163.com/blog/static/46790992015101052627354/ 这里也有一份,等我过两天空了修复下图片。

    评论于 2015-11-20 18:05 回复

    謝謝,看到圖片了

  • 评论于 2015-11-22 19:08 举报

    非常感谢koko提供如此详细的教程!
    有个问题请教:第五步以上的都可以实现,但是在访问页面的时候,设定的访问规则并没有起作用。自己排查了很久都找不出来原因,最有可能的原因是什么?

    5 条回复
    评论于 2015-11-23 10:26 回复

    最有可能的原因:有别的规则冲突,比如yii2-admin默认的site/,admin/是所有人可以访问的。可能你访问的节点配置了多个规则。

    评论于 2015-11-23 20:14 回复

    谢谢回复,终于发现问题了,是我的配置文件中as access放到了components中,呵呵。

    评论于 2016-05-16 19:10 回复

    感谢大神,我也是和你犯了一样的错误

    评论于 2016-11-10 19:55 回复

    这个是怎么变成中文的

    评论于 2018-01-18 20:51 回复

    感谢,我也是同样的错误。

    , 觉得很赞
  • 评论于 2015-11-25 09:18 举报

    好东西,正有需求。

  • 评论于 2015-12-08 17:05 举报

    你好 yii2-admin 这个插件 yii migrate --migrationPath=@mdm/admin/migrations 执行完这个就报错 是什么原因啊。

    Exception 'yii\base\InvalidParamException' with message 'Invalid path alias: @md
    m/admin/migrations'
    
    9 条回复
    评论于 2015-12-08 18:25 回复

    提示路径不对,你有安装完这个插件吗?

    评论于 2015-12-09 10:39 回复

    composer require mdmsoft/yii2-admin "~2.0" 执行成功了

    D:\www\yii>composer update
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Nothing to install or update
    Generating autoload files 
    

    就报这些的错误

    评论于 2015-12-09 11:21 回复

    这个只是提示没有组件被安装升级。 如果yii2-admin正确安装了,通过http//localhost/index.php?r=admin(链接要改成你首页的地址),你的yii2是基础模板,默认是没有创建user表的,你需要手动建一个user表,或者让yii2-admin使用配置文件,而不是数据库。

    评论于 2016-01-07 10:19 回复

    兄弟,你这问题是怎么解决的啊?我也遇到了和你一样的问题!

    评论于 2016-01-13 17:51 回复

    什么问题啊 解决了吗?

    评论于 2016-01-15 09:59 回复

    解决了!

    评论于 2016-05-07 16:25 回复

    你怎么解决的?

    评论于 2016-08-03 11:31 回复

    “yii migrate” 这个命令是在命令行执行,所以你需要把配置文件写到console/config/console.php的components下面。

    评论于 2016-11-11 14:29 回复

    在console的配置文件下配置rbac

    , 觉得很赞
  • 评论于 2015-12-17 23:46 举报

    感谢,楼主! 自定义规则和yii2-admin的菜单的应用,有帖子吗?

    1 条回复
    评论于 2015-12-18 09:28 回复

    暂时还没有,有时间你可以先去网上搜下,有相关的内容。

  • 评论于 2015-12-20 15:49 举报

    请教一下,怎么使yii2 admin 也能使用yii2-admin 进行权限验证管理。

    4 条回复
    评论于 2015-12-21 09:14 回复

    再描述的详细些... yii2 admin是啥?一个model?那照上面的配置应该能直接使用

    评论于 2015-12-21 17:24 回复

    配置完后,访问url/admin 进行权限配置,配置完后,应该是匿名用户就不能访问了,但是没有登录的用户还是能访问,是不是哪里漏配置了。

    评论于 2015-12-21 22:16 回复

    默认有个配置是admin路由所有人都能访问,需要注释掉那一行。

    评论于 2015-12-22 11:14 回复

    3ks 以为as access是累赘作用,就没有加,原来还有这个功能,已解决

  • 评论于 2015-12-29 09:55 举报

    棒棒哒。。。。。

  • 评论于 2016-01-04 15:51 举报

    用其它的数据表结构可以实现yii2-admin的接口吗

    1 条回复
    评论于 2016-01-04 17:31 回复

    你的需求是?

  • 评论于 2016-01-04 19:41 举报

    大神,麻烦提供下user表创建的SQL语句脚本呗
    我看了你给的链接,里面有yii2安装过程的,这一步我做好了,yii2-admin也安装了,但是没有创建User表。

    • yii2-admin对user表的字段是否有要求
    • yii2-admin是否需要这样的前提:登录验证部分已经修改为使用数据库验证?

    谢谢!

    假定你已经安装好了yii2,且数据库中创建了user表。具体安装步骤可见此文档。

    1 条回复
    评论于 2016-01-04 23:00 回复

    这个网站上有,搜索下就出来了。如果你安装的是高级模板,系统默认是带了user表的创建语句,在console\migrations下

  • 评论于 2016-01-05 19:40 举报

    补充一个我碰到的问题,给可能需要人参考:

    使用basic模板创建app时,必须要在config/console.php中设置authManager使用rbac:

        'components' => [
            'db' => $db,
            'authManager' => [
                'class' => 'yii\rbac\DbManager',
            ],
        ],
    

    否则,执行yii migrate的时候会报InvalidConfigException异常:

    [jason@kali:/var/www/learn/basic]$ ./yii migrate --migrationPath=@yii/rbac/migrations
    Yii Migration Tool (based on Yii v2.0.6)
    
    Total 1 new migration to be applied:
    	m140506_102106_rbac_init
    
    Apply the above migration? (yes|no) [no]:yes
    *** applying m140506_102106_rbac_init
    NULL
    Exception 'yii\base\InvalidConfigException' with message 'You should configure "authManager" component to use database before executing this migration.'
    
    in /var/www/learn/basic/vendor/yiisoft/yii2/rbac/migrations/m140506_102106_rbac_init.php:29
    
    Stack trace:
    #0 /var/www/learn/basic/vendor/yiisoft/yii2/rbac/migrations/m140506_102106_rbac_init.php(36): m140506_102106_rbac_init->getAuthManager()
    #1 /var/www/learn/basic/vendor/yiisoft/yii2/console/controllers/BaseMigrateController.php(492): m140506_102106_rbac_init->up()
    #2 /var/www/learn/basic/vendor/yiisoft/yii2/console/controllers/BaseMigrateController.php(129): yii\console\controllers\BaseMigrateController->migrateUp('m140506_102106_...')
    #3 [internal function]: yii\console\controllers\BaseMigrateController->actionUp(0)
    #4 /var/www/learn/basic/vendor/yiisoft/yii2/base/InlineAction.php(55): call_user_func_array(Array, Array)
    #5 /var/www/learn/basic/vendor/yiisoft/yii2/base/Controller.php(151): yii\base\InlineAction->runWithParams(Array)
    #6 /var/www/learn/basic/vendor/yiisoft/yii2/console/Controller.php(91): yii\base\Controller->runAction('', Array)
    #7 /var/www/learn/basic/vendor/yiisoft/yii2/base/Module.php(455): yii\console\Controller->runAction('', Array)
    #8 /var/www/learn/basic/vendor/yiisoft/yii2/console/Application.php(167): yii\base\Module->runAction('migrate', Array)
    #9 /var/www/learn/basic/vendor/yiisoft/yii2/console/Application.php(143): yii\console\Application->runAction('migrate', Array)
    #10 /var/www/learn/basic/vendor/yiisoft/yii2/base/Application.php(375): yii\console\Application->handleRequest(Object(yii\console\Request))
    #11 /var/www/learn/basic/yii(19): yii\base\Application->run()
    #12 {main}
    

    注意:上面*** applying m140506_102106_rbac_init下面这行打印出来的NULL,是因为我调试过程中修改了代码,在第28行添加了输出:

    [jason@kali:/var/www/learn/basic]$ grep -n var_dump -C3 /var/www/learn/basic/vendor/yiisoft/yii2/rbac/migrations/m140506_102106_rbac_init.php 
    25-    {
    26-        $authManager = Yii::$app->getAuthManager();
    27-        if (!$authManager instanceof DbManager) {
    28:            var_dump($authManager);
    29-            throw new InvalidConfigException('You should configure "authManager" component to use database before executing this migration.');
    30-        }
    31-        return $authManager;
    
    4 条回复
    评论于 2016-01-05 20:01 回复

    这步本来就是必须的。。。 我教程中应该有提到吧

    评论于 2016-01-05 20:05 回复

    对于basic模板的,配置文件要修改config/web.php,同时也要修改config/console.php
    不过,你写的是针对advanced模板的,原文:

    注意:如果将yii2-admin配置在common目录下是全局生效,会导致控制台(console)下命令报错。
    因为仅将权限控制应用于frontend模块,所以将配置写到frontend目录下。
    配置文件:frontend\config\main.php

    评论于 2016-01-05 20:13 回复

    谢谢补充,只用过一次basic模板。没动手去配置过。

    评论于 2017-01-17 13:46 回复
    Problem was quite simple: The configuration was not used. yii migrate is a console command and usually the configuration for such commands is placed in a seperated file. 
    
    In case of yii2-app-base template, from which I have created my application, there is a config/console.php configuration file where the authManager needs to be declared. It is not sufficient to have it in the config/web.php declared only.
    
    In case of yii2-app-advanced the authManager should be declared in console/config/main.php and not in the backend or frontend configuration files.
    

    refer:http://stackoverflow.com/questions/30478903/yii2-cannot-perform-rbac-migration-you-should-configure-authmanager

    , 觉得很赞
  • 评论于 2016-01-22 09:34 举报

    先应用了dektrium/yii2-user ,然后能不能用这个?

    5 条回复
    评论于 2016-01-22 10:12 回复

    应该是不冲突,两个插件工作在不同的地方

    评论于 2016-01-22 10:33 回复

    dektrium/yii2-user 也有一个rabc ,不过没有自带界面,要不然,用一家的感觉可能会好点

    评论于 2016-01-22 10:50 回复

    如果它也有rbac,那在配置文件中指定哪个插件接管就行

    评论于 2016-01-22 10:52 回复

    估计几个插件的rbac用的配置文件都是同一个。yii2-admin就是自己做了个图形界面,扩展了一个数据库版。

    评论于 2016-01-22 13:43 回复

    好的,我先研究一下,谢谢

  • 评论于 2016-03-14 11:36 举报

    分配权限哪里没用,不知道哪里错了

    4 条回复
    评论于 2016-03-14 13:03 回复

    你当前环境里有注册账号不?具体是什么个没用法,得说清楚才能帮到你

    评论于 2016-03-14 13:38 回复

    就是分配了权限,没用。普通用户还是和管理员一样的权限

    评论于 2016-03-14 13:50 回复

    步骤五没成功,前四步成功

    评论于 2016-03-14 14:49 回复

    检查你的默认权限,可能你默认就是管理员权限

  • 评论于 2016-03-19 15:22 举报

    我用
    composer require mdmsoft/yii2-admin "~2.0"
    composer update这两行命令下载报错啊

    The "yiisoft/yii2-composer" plugin requires composer-plugin-api 1.0.0, this *WIL
    L* break in the future and it should be fixed ASAP (require ^1.0 for example).
    Deprecation Notice: The Composer\Package\LinkConstraint\MultiConstraint class is
     deprecated, use Composer\Semver\Constraint\MultiConstraint instead. in phar://C
    :/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/Package/LinkConstrain
    t/MultiConstraint.php:17
    Deprecation Notice: The Composer\Package\LinkConstraint\LinkConstraintInterface
    interface is deprecated, use Composer\Semver\Constraint\ConstraintInterface inst
    ead. in phar://C:/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/Packa
    ge/LinkConstraint/LinkConstraintInterface.php:17
    ./composer.json has been updated
    The "yiisoft/yii2-composer" plugin requires composer-plugin-api 1.0.0, this *WIL
    L* break in the future and it should be fixed ASAP (require ^1.0 for example).
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    
    Installation failed, reverting ./composer.json to its original content.
    
    
      [ErrorException]
      Illegal offset type in isset or empty
    
    
    require [--dev] [--prefer-source] [--prefer-dist] [--no-plugins] [--no-progress]
     [--no-update] [--update-no-dev] [--update-with-dependencies] [--ignore-platform
    
    4 条回复
    评论于 2016-03-21 14:49 回复

    没装这个 composer-plugin-api 1.0.0

    评论于 2016-03-21 19:02 回复

    哦,谢谢啊!不过我已经学会了用yii2自带的rbac。还是谢谢你。

    评论于 2016-03-22 08:56 回复

    这个用的也是rbac,只是做了个图形界面而已

    评论于 2016-03-22 09:15 回复

    嗯,明白,不过我后台模板用的bootstrap,所以也就不下这个插件了

  • 评论于 2016-04-08 15:35 举报

    这个内置的用户表的密码规则怎么来的,自己创建的用户和验证机制不一致, 好麻烦, 怎么用内置的创建新用户.

    2 条回复
    评论于 2016-04-08 15:44 回复

    你本地网站首页就有登录链接,里边可以新建用户.

    评论于 2016-04-09 15:32 回复

    首页的用户和admin后台的不是一个体系, 创建密码机制都不一样,,这个后来的版本才有地址是 最新版 admin/user/signup

  • 评论于 2016-04-27 17:43 举报
    yii migrate --migrationPath=@mdm/admin/migrations
    yii migrate --migrationPath=@yii/rbac/migrations
    

    这两行代码是在什么地方执行的,怎么执行的?

    3 条回复
    评论于 2016-04-28 10:49 回复

    命令行窗口,yii目录

    评论于 2017-05-16 01:27 回复

    为什么运行之后数据库表没有创建,也没有报错啊

    评论于 2017-05-16 08:48 回复

    请确认你在正确的路径下执行了命令

  • 评论于 2016-05-01 18:53 举报

    运行这个 报错了 是什么原因

    composer require mdmsoft/yii2-admin "~2.0"
    You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
    
    
      [ReflectionException]
      Class Fxp\Composer\AssetPlugin\Repository\NpmRepository does not exist
    
    
    
      [ErrorException]
      Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRepository
      ::whatProvides() should be compatible with Composer\Repository\ComposerRepo
      sitory::whatProvides(Composer\DependencyResolver\Pool $pool, $name, $bypass
      Filters = false)
    
    
    require [--dev] [--prefer-source] [--prefer-dist] [--no-plugins] [--no-progress] [--no-update] [--update-no-dev] [--update-with-dependencies] [--ignore-platform-reqs] [--sort-packages] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--] [<packages>]...
    
    1 条回复
    评论于 2016-05-03 16:09 回复

    composer的问题确实烦人,我自己有时也是一头雾水. 建议直接去搜索composer的报错信息,能找到更详细的解答. 看你的报错信息应该和composer-plugin-api有关,再安装一次试试.

  • 评论于 2016-05-09 16:22 举报

    我样式还有目录结构应该如何去修改呢。我想要和自己的后台样式统一

    1 条回复
    评论于 2016-05-09 16:30 回复

    yii-admin有模板文件,你可以自己定义一个模板.详细去它官网看看吧

  • 评论于 2016-05-16 19:24 举报

    权限界面是出来了,就是在路由里找不到我用gii生成的方法,请问是为啥?

    4 条回复
    评论于 2016-05-17 09:08 回复

    这个最小单位只到路由吧,新添加的,旁边有个刷新按钮,点了以后会更新列表

    评论于 2016-05-17 09:33 回复

    点过刷新按钮,还是没有。后来删了2.0的版本,重新安装3.0的版本,在路由里依然没有自己添加的方法,只有默认的40个方法,那都是/admin/ 、 /class/ 这些下面的方法

    评论于 2016-05-17 09:42 回复

    符合PSR-0规范的路由会自动识别出来,自定义的路由就需要手动添加到配置中去

    评论于 2016-05-17 09:50 回复

    刷新按钮上面不就是添加按钮么?没有就自己添加呗

  • 评论于 2016-05-25 22:20 举报

    怎么获取当前用户没有某个权限?谢谢!

    1 条回复
    评论于 2016-05-26 09:32 回复
    Yii::$app->user->can('/site/index')
    
您需要登录后才可以评论。登录 | 立即注册