我现在正在使用rbac yii2。 我在数据库中定义了所有角色和权限。 现在问题是我应该在哪里检查访问规则? 例如,作者可以更新自己的帖子。 我也在rule_name ='isAuthor'中保存了数据库中的规则。 但我对访问自己帖子的检查条件感到困惑。
这是我的actionRule:
<?php
public function actionRule(){
$auth = Yii::$app->authManager;
$rule = new \app\rbac\AuthorRule;
$auth->add($rule);
$updateMobile = $auth->createPermission('mobile/update');
// add the "updateOwnMobile" permission and associate the rule with it.
$updateOwnMobile = $auth->createPermission('updateOwnMobile');
$author = $auth->createPermission('author');
$updateOwnMobile->description = 'Update own mobile';
$updateOwnMobile->ruleName = $rule->name;
$auth->add($updateOwnMobile);
// "updateOwnMobile" will be used from "updatePost"
$auth->addChild($updateOwnMobile, $updateMobile);
// allow "author" to update their own posts
$auth->addChild($author, $updateOwnMobile);
}
?>
我在哪里以及如何实施? 在控制器?行为? 或其他地方?
答案 0 :(得分:0)
如果为作者自己发布了帖子,则检查(can('author')
方法)应该至少有两个原因放在控制器中:
这些是精确的控制器/动作操作..
这些只是一些初步建议
答案 1 :(得分:0)
理想情况下,您应该拥有与规则关联的类(从Yii\rbac\Rule
扩展)。然后实现execute
函数,该函数检查用户是否是帖子的作者,并且他有权更新帖子。
这样的事情:
class SiteRule extends Rule
{
//you can modify this to suit your needs.
public function execute($user, $item, $params)
{
//get user ie: \dektrium\user\models\User::findIdentity($user)
//check if the $user is the author - using defined author or created-by attribute in $params.
//return true/false
}
}
然后在您的控制器/操作中,您可以使用CheckAccess()
方法(yii\rbac\ManagerInterface
)来检查用户是否有权访问:
if(\yii::$app->user->can('author', ['post'=>\Yii::$app->request->post()(or your model]))
{//logic here}