这是关于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获得反馈?
所以基本上我所做的只是添加
'message' => 'Current password cannot be blank.'
根据我的规则。
确保您分离正确的规则,因此您不会在多个字段上获取该消息,而这些字段没有意义。还要确保将其添加到“必需”规则中,除非您希望该消息在另一个规则时显示。
我希望这对你们有所帮助,因为我花了太多时间寻找它。
您可能希望创建自己的AccessRule,并通过覆盖该类中的当前方法来设置场景中的消息异常。 matchRole
将是你要覆盖的方法。 Yii2没有这个,所以你必须滚动你自己的AccessRule才能这样做。
然后,一旦创建它将它附加到您的控制器:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'ruleConfig' => [
'class' => 'app\components\AccessRule'
],
'rules' => [
/* my normal rules */
],
],
];
}