Yii2 RBAC规则反馈/消息

问题描述 投票:5回答:2

这是关于Yii2中RBAC使用的问题。

到目前为止,我发现它工作得相当好和令人满意,但是我缺少一个关键功能:Yii2规则能够以与Yii2 Validators设置错误消息类似的方式提供“反馈”,以解释验证失败的原因。我正在寻找一种方法来提供某种反馈,说明为什么没有授予许可。

特别是,can()方法将返回一个布尔类型,这很好,但是在检查权限时,我们不知道为什么用户没有被授予该特定权限。

举一个更实际的例子。假设我们正在尝试确定当前用户是否可以提交评论。我们通常会这样做:

if (Yii::$app->user->can('postComment',['comment'=>$comment])) {
    $comment->post();
} else {
    throw new ForbiddenHttpException('Sorry m8, you cant do this. No idea why tho!');
}

它工作得很好,但是如示例所示,我们真的不知道为什么用户无法发表评论。可能有多种原因,例如因为线程被锁定或者因为他们没有在某个类别中发布的权限,或者因为他们没有足够高的声誉等等。但我们想告诉用户原因!所以我的问题是,我们如何从Yii2的RBAC获得反馈?

yii2 rbac yii2-rbac
2个回答
1
投票

所以基本上我所做的只是添加

'message' => 'Current password cannot be blank.' 

根据我的规则。

确保您分离正确的规则,因此您不会在多个字段上获取该消息,而这些字段没有意义。还要确保将其添加到“必需”规则中,除非您希望该消息在另一个规则时显示。

我希望这对你们有所帮助,因为我花了太多时间寻找它。


0
投票

您可能希望创建自己的AccessRule,并通过覆盖该类中的当前方法来设置场景中的消息异常。 matchRole将是你要覆盖的方法。 Yii2没有这个,所以你必须滚动你自己的AccessRule才能这样做。

然后,一旦创建它将它附加到您的控制器:

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'ruleConfig' => [
                'class' => 'app\components\AccessRule'
            ],
            'rules' => [
                /* my normal rules */
            ],
        ],
    ];
}
© www.soinside.com 2019 - 2024. All rights reserved.