如何实现can()方法?

时间:2017-08-06 08:05:29

标签: php yii yii2 frameworks

我现在正在使用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);
}
?>

我在哪里以及如何实施? 在控制器?行为? 或其他地方?

2 个答案:

答案 0 :(得分:0)

如果为作者自己发布了帖子,则检查(can('author')方法)应该至少有两个原因放在控制器中:

  1. 您不仅应该检查该用户是否具有角色/权限作者,还应检查该帖子的所有者是否为该用户
  2. 一旦检查用户是否可以执行相关代码,您必须驱动正确的响应(如果用户可以,则呈现更新表单,否则呈现拒绝访问的消息)
  3. 这些是精确的控制器/动作操作..

    这些只是一些初步建议

答案 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}