关于Laravel策略授权的自定义消息

时间:2019-06-06 08:26:16

标签: laravel laravel-5 authorization policy laravel-5.8

在我的Laravel 5.8项目中,我正在实现一个与Stack Exchange相似的信誉系统:例如,用户只有在具有“ 3级”信誉的情况下才能回复讨论。

我想使用Laravel的策略系统来构建权限逻辑,就像在我的DiscussionPolicy文件中一样:

public function reply(User $user)
{
    $result = true;
    if ($user->current_level < 3) {
        $result = false;
        //I want to inject a custom error message here
    }
    return $result;
}

一切正常,但是用户得到的403页没有任何说明,我想找到一种优雅的方法来告诉他们由于没有级别3而无法执行该操作。

您能否建议一种以某种方式注入此消息的方法,以在我的自定义403.blade.php页面中显示?我已经可以通过在会话中刷新变量来做到这一点,但是我认为它并不优雅,我想使用像MessageBag(Illuminate \ Support \ MessageBag)之类的东西。

2 个答案:

答案 0 :(得分:4)

在评论中给出了答案,在这里供参考:

Laravel通过HandlesAuthorization特性中的deny()函数提供此功能。 deny()函数引发UnauthorizedException,但允许您指定一条消息,而不是引发普通异常。

return false代替它,您可以发送自定义消息以在异常处理程序中呈现。

示例:

public function reply(User $user)
{
    if ($user->current_level < 3) {
        $this->deny('Sorry, your level is not high enough to do that!');
    }
    return true;
}

答案 1 :(得分:2)

我想我会在我到达这里搜索如何从策略方法返回消息时添加这个答案,因为我维护的代码仅在不允许操作时返回 false

current documentation 表示从您的策略方法返回一个 Illuminate\Auth\Access\Response 实例:

...
use Illuminate\Auth\Access\Response;

public function update(User $user, Post $post)
{
    return $user->id === $post->user_id
                ? Response::allow()
                : Response::deny('You do not own this post.');
}