【问题标题】:Yii2 authentication based on record levelYii2 基于记录级别的认证
【发布时间】:2014-11-13 19:34:07
【问题描述】:

在 yii2 中,我还需要一些记录级别的 RBAC 访问控制。作为一个 yii2 初学者,我正在寻找输入逻辑的最佳点,但在文档中挣扎。

例子:

  • 一个表Children提到了一个child,除了很多其他children
  • 一个孩子通常在Parents表中有两个父母
  • 除了使用 yii2-admin/user 进行其他访问控制之外,这两位家长可以查看和操作他们自己的孩子/ren 但不能查看和操作其他人的记录。
  • 登录的用户是父母。

示例表儿童

|id|name|age|
|1|Max|10|
|2|Moritz|11|
|3|Lena|8|
...

示例表父母

|id|relation|name|
|1|mother|Anna|
|2|father|Paul|
|3|mother|Lisa|
...

示例表Xref(与孩子父母的关系):

|child_id|parent_id|
|1|1|
|1|2|
|2|3|
|3|1|
|3|2|
...

我认为 activeRecord 类 Children 是适合这种行为的地方,对吧? 是否有人有示例代码可以为我指出正确的方向以获得有效的代码, Paul 和 Anna 可以在哪里修改“Max”的记录,但不能修改“Moritz”的记录?

【问题讨论】:

  • 在记录层上使用 RBAC 通常被认为是糟糕的设计。在您的情况下,您可能应该有一个 ActiveRecord 方法,它将用户 id 作为参数并返回孩子。 RBAC 级别过滤(是否可以写/查看)应该在控制器级别。
  • 我同意,并感谢您的提示。作为 yii 的初学者(不是编程的初学者),我想要求提供一个代码片段作为示例,以便了解情况。你能帮忙吗?

标签: activerecord yii2 rbac


【解决方案1】:

我几乎没有在 Yii2 中使用过关系数据库,但我会尽可能地说明我的意思:

我将说明父类,因为孩子将大致相似(除了关系方向):

class ParentModel extends ActiveRecord
{
    /**
     * @return string the name of the table associated with this ActiveRecord class.
     */
    public static function tableName()
    {
        return 'Parents';
    }

    public function getChildren()
    {
        // ParentModel has_many ChildModel via Xref.child_id -> id
        return $this->hasMany(ChildModel::className(), ['id' => 'child_id'])
            ->viaTable('Xref', ['parent_id' => 'id']);
    }
}

有了这个,你可以通过使用(例如)获得所有孩子:

$user = ParentModel::findOne($userID);
$children = $user->children;

然后,您可以使用所有 RBAC 功能来确保您的用户无法访问编辑表单操作/视图。或者使用 RBAC rules 确保只处理适当的内容。 或者您可以编写自己的检查以确保(例如)正在处理的子项确实属于访问控制器操作的父项。 (比如说......将用户的孩子与正在处理的孩子进行比较,尽管根据您的结构,这可以通过 RBAC 规则来处理)

但无论操作如何,该逻辑都应保留在控制器层上。在极少数情况下,您可能必须在模型中放置访问权限逻辑,但模型应该将该逻辑分开并且与 RBAC 系统无关。我个人在 ActiveQuery 级别上遇到过图形遍历逻辑的问题。但这本身就是另一个问题。

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多