Laravel 策略授权的自定义消息
Custom message on Laravel policy authorization
在我的 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 通过 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!');
// 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;
}
我想我会添加这个答案,因为我到达这里搜索如何 return 来自策略方法的消息作为我只维护 returns false
的代码不允许执行操作。
current documentation 向 return 表示来自您的策略方法的 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.');
}
给你:
class DiscussionPolicy
{
use HandlesAuthorization;
public function reply(?User $user)
{
if(!$user) return $this->deny("Your access denied.");
}
}
在我的 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 通过 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!');
// 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;
}
我想我会添加这个答案,因为我到达这里搜索如何 return 来自策略方法的消息作为我只维护 returns false
的代码不允许执行操作。
current documentation 向 return 表示来自您的策略方法的 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.');
}
给你:
class DiscussionPolicy
{
use HandlesAuthorization;
public function reply(?User $user)
{
if(!$user) return $this->deny("Your access denied.");
}
}