这是一个关于在Yii2中使用RBAC的问题。
到目前为止,我发现它运行得相当好,而且令人满意,但是我缺少一个关键特性: Yii2规则以类似于Yii2验证器设置错误消息的方式提供“反馈”的能力,以解释验证失败的原因。我正在寻找一种方法,以提供某种形式的反馈,为什么不给予许可。
特别是,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!');
}
它工作得很好,但正如示例中所示,我们真的不知道为什么用户不能发布评论。可能有很多原因,例如因为线程被锁定了,或者因为它们没有在某个类别中发布的权限,或者因为它们没有足够高的声誉等等。但是我们想告诉用户为什么!所以我的问题是,我们如何从易2的RBAC那里得到反馈?
发布于 2016-04-01 08:51:28
您可能希望创建自己的AccessRule,并通过重写该类中的当前方法来设置场景中的消息异常。matchRole
将是您要重写的方法。Yii2没有这样的功能,因此您必须使用自己的AccessRule才能这样做。
然后,一旦其创建后,将其附加到控制器上:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'ruleConfig' => [
'class' => 'app\components\AccessRule'
],
'rules' => [
/* my normal rules */
],
],
];
}
发布于 2016-04-02 14:17:26
所以基本上我所做的就是
'message' => 'Current password cannot be blank.'
遵守我的规则。
确保您分离了正确的规则,这样您就不会在多个字段上得到这条消息,因为这是没有意义的。还请确保将其添加到“必需”规则中,除非您希望该消息在另一个规则时显示出来。
我希望这能帮到你们,因为我花了太多的时间去寻找它。
发布于 2020-04-19 23:26:23
在您的例子中,我将创建一个基本权限类,它将用一个简单的方法覆盖特定限制消息的抽象,它将由扩展--您的所有权限--。
这是抽象的许可蓝图。
abstract class AbstractPermission extends Permission
{
/**
* @return string
*/
abstract public function getRestrictionMessage(): string;
}
创建自定义数据库管理器,以检查检索到的权限是否实现了抽象。
class CustomDbManager extends DbManager
{
/**
* @throws \Exception
* @return AbstractPermission|null
*/
public function getPermission($name): ?AbstractPermission
{
$permission = parent::getPermission($name);
if ($permission === null) {
return null;
}
if (!$permission instanceof AbstractPermission) {
throw new \Exception(
'Your permission class should be derived from ' . AbstractPermission::class
);
}
return $permission;
}
}
在配置文件中定义CustomDbManager
'components' => [
'authManager' => [
'class' => CustomDbManager::class
],
...
];
以PostCommentPermission
为例。
class PostCommentPermission extends AbstractPermission
{
/**
* @return string
*/
public function getRestrictionMessage(): string
{
return 'You cannot post comments!';
}
}
最后,使用特定的权限检查调用您的经理。
$authManager = Yii::$app->getAuthManager();
$postCommentPermission = $authManager->getPermission('postComment');
if (Yii::$app->user->can($postCommentPermission->name, ['comment' => $comment])) {
$comment->post();
} else {
throw new ForbiddenHttpException($postCommentPermission->getRestrictionMessage());
}
https://stackoverflow.com/questions/36353019
复制相似问题