laravel - Laravel (7) Resource Policies don't work with CamelCase, get a 403 for view policy (show in controller)
问题描述
这里有两个示例,第一个用于 ResourceController(返回 200 - ok),第二个用于 ResourceLogsController(返回 403 - 未授权)
api.php
// RESOURCES
Route::apiResource('resources','Api\ResourceController');
// RESOURCELOGS
Route::apiResource('resourcelogs','Api\ResourceLogController');
身份验证服务提供者:
use App\Policies\ResourcePolicy;
use App\Policies\ResourceLogPolicy;
// ...
protected $policies = [
Resource::class => ResourcePolicy::class,
ResourceLog::class => ResourceLogPolicy::class
];
资源控制器:
public function __construct()
{
$this->middleware('auth:api');
$this->authorizeResource(Resource::class, 'resource');
}
public function index(Resource $resource)
{
dd('authorization ok');
}
public function show(Resource $resource)
{
dd('authorization ok');
}
资源日志控制器:
public function __construct()
{
$this->middleware('auth:api');
$this->authorizeResource(ResourceLog::class, 'resourcelog');
}
public function index(ResourceLog $resourceLog)
{
dd('authorization ok');
}
public function show(ResourceLog $resourceLog)
{
dd('no authorization here');
}
ResourcePolicies:只返回一个简单的 true 作为测试
class ResourcePolicy
{
use HandlesAuthorization;
public function viewAny(User $user)
{
return true;
}
public function view(User $user, Resource $resource)
{
return true;
}
ResourceLogPolicies:只返回一个简单的 true 作为测试
class ResourceLogPolicy
{
use HandlesAuthorization;
public function viewAny(User $user)
{
return true;
}
public function view(User $user, ResourceLog $resourceLog)
{
return true;
}
我尝试将 $this->authorizeLogResource 中的第二个参数更改为小写、chamelcase 等。
$this->authorizeResource(ResourceLog::class, 'resourcelog'); $this->authorizeResource(ResourceLog::class, 'App\ResourceLog'); // = 函数 App\Policies\ResourceLogPolicy::view() 的参数太少,通过了 1 个
我确实在中间件下看到了资源而不是资源日志...
解决方案
在taylorotwell本人的帮助下回答:
在路由器中:
Route::apiResource('resourceLogs','Api\ResourceLogController');
控制器:
public function __construct()
{
$this->middleware('auth:api');
$this->authorizeResource(ResourceLog::class, 'resourceLog');
}
方法:
public function show(ResourceLog $resourceLog)
{
return new ResourceLogResource($resourceLog);
}
Route 和 authorizeResource + $resourceLog (!) 中的“ resourceLogs ”需要具有相同的大小写。
推荐阅读
- android - Agora React-Native No Video Feed (Audio Only) 在较新的 Android 设备上部署的应用程序(是 S10,Pixel 3)
- python - 如何在 Python 中使用 RegEx 获取两个带换行符的字符串之间的字符串
- python - 在转换第三列时将 excel 转换为 pdf 问题
- excel - 如何创建仅显示过去 4 周的动态图表?
- python - 如何使用熊猫在同一行索引下拥有多行
- javascript - Javascript Switch 语句损坏?
- php - 使用 PHP 7.3.8 的未定义常量 CURLINFO_SCHEME
- javascript - 有角的。发送数组数据获取Itunes API;从组件搜索到组件主,通过服务
- regex - 如何在Jmeter中处理没有任何href的引导按钮?
- r - 如何绘制两个文件中的数据?