关于 Yii2 RBAC 的疑惑

2024-04-28

到目前为止,我一直在使用 Yii 1.1.14 开发 Web 应用程序,但现在是时候进行升级了。

我工作的公司开发了自己的访问控制系统,我对它真的很满意,直到我看到它到底是什么样子......数据库中8个表的组合(不包括用户表),还有一堆外键。

  • 1 个控制器表
  • 1 个操作表
  • 1 个菜单类别表
  • 1 个用户类型表
  • 其他表基本上一次只连接 2 或 3 个表。

它工作得很好,但在我看来,维护所有这些表非常耗时,并且在某些时候,当您的应用程序上线时,如果它达到一定数量的用户,它可能会变得非常慢。特别是因为其中 2 个表将用户的表主键作为外键。

所以我决定,当我开始在 Yii 2 上开发时,我将开始使用 RBAC,所以我开始在网上寻找教程......只找到具有作者角色和权限的相同代码的许多不同版本创建或更新帖子。

我在 Youtube 上找到了 5 个视频的组合,但它们都是关于 Yii 1 RBAC 的。它们很有帮助,因为我设法理解了 RBAC 的大部分功能,但我仍然有一些疑问: 列举如下。请记住,对于这个访问控制系统,我使用的是数据库管理器 class.

我的疑虑

  1. Yii 1 的 RBAC 曾经有 3 个表:auth_assignment, auth_item and auth_item_child。现在在 Yii 2 RBAC 中,出现了一个新表,名为auth_rule我仍然不明白那个特定的表在那里做什么,如何使用它或如何填充它。

  2. 我发现可以通过使用控制器的行为方法来限制用户对某些操作的访问,并根据用户的角色分配对某些操作的访问权限,但是当涉及到这一点时,我必须将我的问题分为 2 个:

    2.1. First:如果你可以通过在behaviors方法中设置来限制对actions的访问,那么将权限保存到auth_item table?

    2.2. Second:如果您确实决定根据权限控制访问,那么您到底该怎么做,因为我发现自己在每个函数中编写以下类型的代码,并且我不认为使用 RBAC 应该如此乏味。必须有另一种方法。

    public function actionView($id)
    {
        if(Yii::$app->user->can('view-users')){
            return $this->render('view', [
                'model' => $this->findModel($id),
            ]);
        }else{
            #Redirect to a custom made action that will show a view 
            #with a custom error message
            $this->redirect(['//site/notauthorized']);
        }
    }
    
  3. 由于我们现在使用的访问控制系统,当用户登录时,会执行一个复杂的查询,最终返回一个数组,该数组将保存为会话变量,并将用于创建一个包含尽可能多的菜单。下拉列表作为菜单类别,用户有权访问的控制器所属。如何使用 RBAC 来完成此操作?


我只能真正回答你问题的 2.2,因为 3 听起来根本不像 RBAC 应该做的事情。但是,只要您遵循与您的控制器或操作相匹配的命名约定,您就很可能从规则表中获取所需的信息。

继续回答2.2:

您可以简单地设置这样的行为:

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'actions' => ['view'],
                    'roles' => ['view-users'], //<-- Note, rule instead of role
                ],
        ]
    ]
}

这并不能解决“查看自己的用户”样式权限的不同问题,因为这需要检查 ActiveRecord 模型(好吧,至少在我的应用程序中是这样)。如果您想实现这一目标,请查看我在 Yii 论坛中的帖子:

http://www.yiiframework.com/forum/index.php/topic/60439-yii2-rbac-permissions-in-controller-behaviors/#entry269913 http://www.yiiframework.com/forum/index.php/topic/60439-yii2-rbac-permissions-in-controller-behaviors/#entry269913

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 Yii2 RBAC 的疑惑 的相关文章

  • PHP根据给定索引的匹配值合并数组[重复]

    这个问题在这里已经有答案了 我有两个这样的数组 Array1 Array 0 gt Array ID gt 101 Code gt 1075 Date gt 2012 03 03 17 13 12 433 1 gt Array ID gt
  • 在php中将数组写入文件并获取数据

    我有一个数组 使用后如下所示print r Array 0 gt Array 0 gt piklu name gt piklu 1 gt Array 0 gt arindam name gt arindam 2 gt Array 0 gt
  • 向 tk103 GPS 跟踪器发送命令

    我正在使用 php 开发实时 GPS 跟踪器 Web 应用程序 跟踪器参考号是tk103 我可以从跟踪器接收信息并将其存储到数据库中 设备的 GPRS 模式已启用 我的问题是 如何使用 php ini 将命令从服务器发送到设备 提前致谢 这
  • 关闭旧的 php websocket

    我在用PHP Websockets https github com ghedipunk PHP Websockets创建一个简单的聊天服务器 当我第一次运行在我的服务器上创建 websocket 的 php 脚本时 一切正常 如果脚本由于
  • 如何使用 php 创建谷歌双因素身份验证?

    我想在我的 PHP 项目中使用 Google 2FA 用户登录时需要输入6位2fa代码 您可以画出一些关于该朝哪个方向走的提示吗 步骤 1 创建长度为 16 个字符的唯一密码 PHPGangsta 为 Google Authenticato
  • 使用 PHP 将表单数据发送/发布到 URL [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个通过 POST 提交的表单 提交表单后我捕获变量 如何连接表单数据 然后将其 POST 到 url 然后重新定向到感谢页面 这不是确
  • php字符串是值类型吗?

    为什么php的string是值类型 每次将参数传递给函数时 每次进行赋值时 每次连接都会导致字符串被复制时 它都会被复制到各处 我的 NET 经验告诉我 它似乎效率低下 迫使我几乎在任何地方都使用引用 考虑以下替代方案 替代方案1 This
  • Laravel 验证:对 null 的成员函数调用失败()

    这段代码几天前还可以工作 但我似乎做了一些事情导致它崩溃 我有这条路线 Route post admin routemanagement AdminController addRoute 看起来像这样 public function add
  • PHP 强制 Apache 错误

    感谢这个论坛 我了解到 PHP header 函数实际上并不将 header 发送到 Apache 服务器 而只发送到客户端 我想要做的是生成错误 500 并让 Apache 显示其相应的页面 有办法强制吗 提前致谢 还有 Allez le
  • 将数组文字传递给 PostgreSQL 函数

    我有一个包含 select 语句的 Postgres 函数 我需要使用包含字符串值数组的传入变量添加条件 CREATE OR REPLACE FUNCTION get questions vcode text RETURN return v
  • 通过自定义文本更改库存文本中的 WooCommerce 产品可用性

    我想更改库存数量后面的 有库存 文字 我尝试在我的 WordPress php 编辑器中添加此 PHP 代码 但它不起作用 你知道为什么吗 谢谢 add filter woocommerce get availability text bb
  • Codeigniter 处理大文件时允许的内存大小耗尽

    我发布此内容是为了防止其他人正在寻找相同的解决方案 因为我刚刚在这个废话上浪费了两天时间 我有一个 cron 作业 每天使用一个非常大的文件更新数据库一次 使用以下代码 if handle fopen dirname FILE uncomp
  • 将 __DIR__ 常量与字符串连接作为数组值,该数组值是 PHP 中的类成员

    谁能告诉我为什么这不起作用 这只是我在其他地方尝试做的事情的一个粗略的例子 stuff array key gt DIR value 但是 这会产生错误 PHP Parse error syntax error unexpected exp
  • 如何将从 MySQL 获取的数据以 JSON 形式返回到 php 文件中?

    我必须将从 MySQL 表中获取的数据作为 JSON 返回到 php 文件中 这是我连接到 mysql 并从中获取数据的代码 现在我怎么能将它作为 JSON 返回呢
  • 为什么 symfony DOMCrawler 对象无法在依赖的 phpunit 测试之间正确传递?

    我有一个适用于我的 symfony 应用程序的 phpunit 测试套件 在该测试文件中 我在不同的测试之间有一些依赖关系 并在依赖关系之间传递一个 DOMCrawler 对象 这样我就不必每次都导航到它 但是 在采用我所做的方法时 您似乎
  • 将文本中的所有 URL 替换为 PHP 中的可点击链接[重复]

    这个问题在这里已经有答案了 我有一个用 PHP 编写的 Web 应用程序 我想找到用户评论中的所有 URL 并将它们更改为可点击的链接 我搜索了很多网站和页面 找到了以下解决方案 不幸的是我没有再次找到它的参考链接 感谢其作者 该代码可以完
  • PHP写入文件时,如何使用现有文本在文件前面添加和追加文本?

    我正在使用 PHP 创建一个 xml 文件 这里有一些示例代码 myFile example file xml fh fopen myFile w while row mysql fetch array result stringData
  • 使用 dockerfile 在 docker 中安装 mongodb 驱动

    我有一个 mongodb docker 容器 我需要另一个安装了 php 和 apache 的 docker 容器 我想从这个容器运行一个 php 脚本并将一些数据发送到 mongodb 容器以将数据保存在 mongodb 数据库中 所以我
  • PHP UTF-8 配置

    我正在使用 PHP 5 3 5 配置 Apache 2 2 17 服务器 我的目标是创建一个默认为内容类型的干净配置UTF 8 php ini default charset UTF 8 default mimetype applicati
  • Google Analytics PHP(发送信息)

    大意 我正在开发一个项目 我需要使用 Google Analytics 服务器端 我不需要检索信息 但我需要发送信息 我最终可以发送 js 脚本客户端 但在这种情况下它不是一个选项 以下大多数链接都非常旧 2012年 检索 不是我需要的 我

随机推荐