php - 授权后未调用 Laravel 6.x 策略(无中间件)
问题描述
我在使用 Laravel 6 政策时遇到了一些问题。即使它应该是未经身份验证的请求,我总是得到 403 未经授权的请求。
文件:
api.php
Route::prefix('v2')
->group(function () {
Route::prefix('agencies')->group(function () {
Route::post('/', 'Api\AgencyController@store');
});
}
代理控制器.php
<?php
namespace App\Http\Controllers\Api;
use App\Entities\Agency;
class AgencyController extends Controller {
public function store(AgencyRequest $request)
{
$this->authorize('create', Agency::class);
// Code that is never executed
}
}
AgencyPolicy.php
class AgencyPolicy
{
public function create(User $user)
{
\Log::info('hello?'); // This Log is never executed
return true;
}
}
AuthServiceProvider.php
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
\App\Entities\Agency::class => \App\Policies\AgencyPolicy::class,
// Other policies
];
public function boot()
{
$this->registerPolicies();
Gate::before(function ($user) {
if ($user->hasRole(SuperAdmin::ROLE_NAME)) {
return true;
}
});
Passport::routes(null, ['prefix' => 'api/oauth']);
}
}
我的代码与文档相同,但我不断收到未经授权的 403,而且我终其一生都无法理解发生了什么。所有帮助将不胜感激。
解决方案
正如 lagbox 所幸回答的那样,答案在文档中,其中指出:
默认情况下,如果传入的 HTTP 请求不是由经过身份验证的用户发起的,所有的门和策略都会自动返回 false。但是,您可以通过声明“可选”类型提示或为用户参数定义提供 null 默认值来允许这些授权检查通过您的门和策略:
因此,我的问题将通过?User
在AgencyPolicy.php中使用来解决:
class AgencyPolicy
{
public function create(?User $user)
{
return true;
}
}
这解决了问题。
推荐阅读
- android - 动态更新文本视图的问题
- c++ - 使用 C++ 在二叉搜索树中存储值
- docker - kafka-connect 有时会在节点突然重启时丢失插件配置
- html - 防止雷鸟放大图像并将其用作链接
- linux - 在 golang 中运行命令并将其与进程分离
- docker - 不同的Docker容器链?
- python - 在python中连接计数变量和字符串
- c# - 如何使用 c# 使用 Visual Studio 代码引用程序集(Entity Framework System.Net)?
- c# - 在运行时为动态创建的对象动态创建绑定
- generics - 捕获由给定 KClass 定义的异常
在科特林?