基于记录级别的Yii2身份验证

时间:2014-11-10 07:39:33

标签: activerecord yii2 rbac

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

示例:

  • 除了许多其他孩子之外,儿童表还提到孩子
  • 孩子通常在父母表中两个父母
  • 除了yii2-admin / user的其他访问控制外,这两位家长可以查看和操纵他们自己的孩子/人的记录,而不是其他人。
  • 登录用户是父级。

示例表儿童

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

示例表父母

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

示例表外部参照(与儿童父母的关系):

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

我认为activeRecord类 Children 对于这样的行为来说是正确的地方,对吧? 有人有一个示例代码指出我有效的代码的正确方向, 保罗和安娜可以修改'Max'的记录而不是'Moritz'的记录?

1 个答案:

答案 0 :(得分:0)

我几乎没有使用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确保仅处理相应的内容。 或者您可以编写自己的检查以确保(例如)正在处理的子项确实属于访问控制器操作的Parent。 (比如说......将用户的孩子与正在处理的孩子进行比较,虽然取决于你的结构,这可以由RBAC规则处理)

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