Laravel 策略授权的自定义消息

问题描述 投票:0回答:4

在我的 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) 的东西。

LARAVEL 8.x:检查这个答案

laravel laravel-5 authorization policy laravel-5.8
4个回答
10
投票

评论里已经给出了答案,放在这里供参考:

Laravel 通过

deny()
 特征中的 
HandlesAuthorization
函数提供此功能。
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!');
        // Laravel 6+ requires you to return the deny(), see following line
        // return $this->deny('Sorry, your level is not high enough to do that!');
    }
    return true;
}

7
投票

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

false

当前文档说要从策略方法返回

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.');
}

0
投票

给你:

class DiscussionPolicy
{
    use HandlesAuthorization;

    public function reply(?User $user)
    {
        if(!$user) return $this->deny("Your access denied.");
    }
}

0
投票

您只需要将

return false
替换为例外即可。

public function reply(User $user)
{
    $result = true;
    if ($user->current_level < 3) {
        throw new \Illuminate\Http\Exceptions\HttpResponseException(response()->json([
           'success'   => false,
           'message'   => 'Your custom message',
           'data'      => [your custom response data]
        ], 403));
    }
    return $result;
}
© www.soinside.com 2019 - 2024. All rights reserved.