koko 2015-11-13 10:42:07 100999次浏览 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的基本用法,并非是最简洁的用法。如有不足之处,还请指正。

觉得很赞
  • 评论于 2017-04-16 23:08 举报

    权限控制应用于backend模块,将配置写到backend目录下,访问http://localhost/yiitest/backend/web/index.php?r=admin
    为什么会报404错误呢

    1 条回复
    评论于 2017-04-16 23:37 回复

    访问admin好像是在frontend下,你配置写到backend只是应用rbac管理规则,不是在backend下管理admin.

  • 评论于 2017-06-03 16:02 举报

    全家人都给你点赞

    1 条回复
    评论于 2017-06-03 16:37 回复

    Σ( ° △ °|||)︴

  • 评论于 2017-06-03 17:21 举报

    YII真是无所不能,给大神跪了

  • 评论于 2017-07-19 21:16 举报

    问下 这个权限和ACF有什么关系?你的教程和ACF没有关系?

    5 条回复
    评论于 2017-07-20 09:00 回复

    acf是指?

    评论于 2017-07-20 12:21 回复

    好像是什么权限过滤器

    评论于 2017-07-20 15:25 回复

    这个插件是acf的一个配置工具,仅仅是一个配置工具。它只是简化了acf的配置工作。acf的具体功能还是yii自己实现的。

    评论于 2017-07-20 18:44 回复

    已经搞不清楚 权限,rbac,acf,adminlte,yii2-admin这些到底什么关系

    评论于 2017-07-21 09:20 回复


    acf是yii简单的访问控制机制,只能针对已登录、未登录的用户作访问控制,无法实现登录后的按权限控制访问;

    权限rbac基于角色的权限访问控制(Role-Based Access Control)的组成部分;

    yii2-adminrbac的一个图形化配置工具,只是一个壳;

    adminlte是一套前端样式,跟上面这些没半毛钱关系,它只是一套网站模板。

    , 觉得很赞
  • 评论于 2017-08-25 15:44 举报

    后台路由列表,左边空白,没有读取到controller和action怎么解决

    1 条回复
    评论于 2017-08-27 20:03 回复

    刷新看下,再就是看下日志里是否有报错。信息太少,判断不了。

  • 评论于 2017-10-23 16:46 举报

    大神 浏览器请求 出现这个微信图片_20171023164539.png
    什么情况啊 追踪源码也没有找到原因位置

    1 条回复
    评论于 2017-10-23 17:09 回复

    找到原因了 是我的user表字段和系统默认不一致 将系统$usernameField 改成我的字段就行了

  • 评论于 2017-12-12 16:33 举报

    大神,菜单管理,添加和修改都不能改父分类,也就是都只是一级分类,显示有js报错,看不懂
    jquery.js:9984 Uncaught TypeError: elem.getClientRects is not a function

    at jQuery.fn.init.offset (http://admin.adminlte.com/assets/131d800a/jquery.js:9984:14)
    at Object.getWithinInfo (http://admin.adminlte.com/assets/2af2b8ea/jquery-ui.js:971:26)
    at jQuery.fn.init.$.fn.position (http://admin.adminlte.com/assets/2af2b8ea/jquery-ui.js:993:23)
    at $.(anonymous function).(anonymous function)._suggest (http://admin.adminlte.com/assets/2af2b8ea/jquery-ui.js:2494:6)
    at $.(anonymous function).(anonymous function)._suggest (http://admin.adminlte.com/assets/2af2b8ea/jquery-ui.js:415:25)
    at $.(anonymous function).(anonymous function).__response (http://admin.adminlte.com/assets/2af2b8ea/jquery-ui.js:2438:9)
    at $.(anonymous function).(anonymous function).__response (http://admin.adminlte.com/assets/2af2b8ea/jquery-ui.js:415:25)
    at $.(anonymous function).(anonymous function)._superApply (http://admin.adminlte.com/assets/2af2b8ea/jquery-ui.js:405:36)
    at $.(anonymous function).(anonymous function).__response (http://admin.adminlte.com/assets/2af2b8ea/jquery-ui.js:2592:8)
    at $.(anonymous function).(anonymous function).__response (http://admin.adminlte.com/assets/2af2b8ea/jquery-ui.js:415:25)
    
    2 条回复
    评论于 2018-01-02 05:36 回复

    我也遇到这个问题了,是因为Jquery UI 1.11.4 and jquery 3.0 的版本兼容问题,我修复的方案是复制了一个 v2.2.4的jquery替换了3.0的版本

    'components' => [
        'assetManager' => [
            'assetMap' => [
                'jquery.js' => '@web/js/jquery/jquery.js', // jquery v3.2.1 和 jQuery UI 1.11.4 版本冲突 @https://stackoverflow.com/questions/37914869/jquery-ui-error-f-getclientrects-is-not-a-function
                'jquery.min.js' => '@web/js/jquery/jquery.js',
            ],
    
    评论于 2018-09-26 15:07 回复

    你好,我也是遇到同样的问题,加了跟你一样的配置,然后在admin/web/js/下添加了一个2.1.4版本的jquery,但是页面加载完之后,在admin/web/assets/下生成的缓存文件还是vendor里边3.2.1版本的jquery文件

    觉得很赞
  • 评论于 2018-03-25 16:46 举报

    有这样一个问题想请教一下,现在的rbac权限控制是基于路由的,比如我创建了一个权限然后添加一个或者多个路由。如果说我想创建一个不对应路由的权限呢?比如说我现在有一个统计页面,统计的信息有订单统计、利润统计、客户统计。而这三个数据都是有统计接口返回的,admin和user角色都可以请求这个接口,但是user只显示订单统计,admin显示所有的统计,我想把这个三个统计定义成三个权限,然后admin和user分配不同的权限,这样我在统计接口中判断当前用户是否拥有某个权限,然后查询不同的数据并返回。我这种场景怎么实现好呢?

    1 条回复
    评论于 2018-03-28 11:55 回复

    查询前检查下用户的权限就行。系统有个语句是可以判断用户是否拥有某些权限。用户有对应的权限,你就查询显示对应的数据

  • 评论于 2018-04-21 18:13 举报

    请问为什么二级菜单无法加到一级菜单下面。手动改数据库后,三级菜单可以加到二级

    4 条回复
    评论于 2018-04-23 09:15 回复

    哪里的菜单?

    评论于 2018-04-24 17:42 回复

    就是admin插件生成的菜单,发现是jquery版本问题,选择的都跑到左上角去了。jquery版本改了之后功能正常了。

    评论于 2018-09-26 15:09 回复

    可以请教一下怎么修改的jquery版本吗,我审查页面元素看到用的是admin/web/assets下的缓存jquery文件,但是只修改这里的,只能暂时使用

    评论于 2018-11-23 10:46 回复

    请问最后解决了吗?

您需要登录后才可以评论。登录 | 立即注册