d3j*_*3jn 1 php authorization laravel
假设我们的模型策略中有操作,可以false在许多不同的场景中返回:
class PostPolicy
{
public function publish(User $user, Post $post)
{
if ($post->user_id !== $user->id) {
return false;
}
return $post->show_at->lessThan(now());
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我们在两种情况下拒绝该用户的发布权:如果这不是他的帖子,或者如果该帖子是为尚未到期的某个未来日期提前准备的。
我如何提供一些有关授权失败原因的背景信息?是因为我们不是所有者还是因为还没有到发表这篇文章的时候?
$user->can('publish', $post); // if this returns false we don't know
// what caused authorization to fail.
Run Code Online (Sandbox Code Playgroud)
看起来 Laravel 的政策在设计上没有任何办法做到这一点。但我很好奇可能有哪些解决方法,以便我们可以在一个地方(模型的策略)拥有授权逻辑(无论多么复杂),并在授权失败时获得一些上下文(即自定义错误代码)。
有任何想法吗?
如果有人需要,除了上面接受的答案之外,在 Laravel 7+ 中,Gate 可以提供拒绝的理由,
参考: https: //laravel.com/docs/7.x/authorization#gate-responses
Gate::authorize()调用将抛出原因以及调用中提供的消息的异常Response::deny(<message>),异常本身将是Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException$user->can()或Gate::allows()将给出布尔值Gate::inspect()将给予充分回应鉴于您现在将返回 Gate Response 对象而不是布尔值,Laravel 将帮助返回上述合适的响应。
<?php
use Illuminate\Auth\Access\Response;
Run Code Online (Sandbox Code Playgroud)
最初,您只返回一个布尔值
<?php
class PostPolicy
{
public function publish(User $user, Post $post)
{
return $post->user_id !== $user->id;
}
}
Run Code Online (Sandbox Code Playgroud)
通过使用门响应,您现在可以提供原因
<?php
use Illuminate\Auth\Access\Response;
class PostPolicy
{
public function publish(User $user, Post $post)
{
return $post->user_id === $user->id
? Response::allow()
: Response::deny('You are not the author of the post.');
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1656 次 |
| 最近记录: |