在yii2中,我还需要在记录级别上进行一些RBAC访问控制。作为一名yii2初学者,我正在寻找进入逻辑的最佳点,但在文档中挣扎。
示例:
示例表儿童:
|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'的记录?
答案 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级别的图形遍历逻辑时遇到了这个问题。但这是其中的另一个问题。