laravel - 将策略与 apiResource 路由一起使用
问题描述
目前我正在编写一个 Laravel 5.6 REST api。现在我想保护我的端点:
我的应用程序中的每个用户都有一个角色。基于此,用户应该能够访问某些端点,否则应该会收到 403 错误。为此,我想使用它Policies
,因为当用作中间件时,它们可以在传入请求甚至到达我的路由或控制器之前授权操作。
我这样声明我的端点:
Route::apiResource('me', 'UserController');
我现在的问题是,如果我想Policies
用作中间件,我必须像这样指定(HTTP)方法middleware('can:update,post')
。apiResource
当我在我的路由声明中使用时,我应该怎么做?
顺便说一句:目前我已经FormRequest
为每种方法编写了一个(这很痛苦)并在那里进行授权。我可以在切换到中间件后简单return true
的方法吗?authorize
Policies
解决方案
由于您FormRequest::class
用于验证请求数据,因此最好先检查用户是否有权发出请求。对于 Laravel 5.6,最简洁的解决方案是在__construct()
资源控制器的方法中手动指定每个策略。
public function __construct()
{
$this->middleware('can:viewAny,App\Post')->only('index');
$this->middleware('can:create,App\Post')->only('store');
$this->middleware('can:view,post')->only('show');
$this->middleware('can:update,post')->only('update');
$this->middleware('can:delete,post')->only('delete');
}
如果您在控制器内验证表单数据而不是使用FormRequest::class
,则更简洁的解决方案是还授权控制器内的用户。
public function store(Request $request)
{
$this->authorize('create', Post::class);
// The user is authorized to make this request...
$request->validate([
//Validation Rules
});
// The form data has been successfully validated...
// Controller logic...
}
__construct()
从 Laravel 5.7 开始,您可以使用控制器方法上的一行代码来完成所有这些工作。
public function __construct()
{
$this->authorizeResource(Post::class, 'post');
}
推荐阅读
- unity3d - 为什么我收到异常 UnityEditor.BuildPlayerWindow+BuildMethodException: 6 个错误以及如何解决?
- r - samples[i-1] 没有使用 Metropolis 填充 Markov-Chain Monte Carlo 的 for 循环?
- flutter - Flutter sharedpreferences setString方法不起作用
- ruby-on-rails - 使用 RGeo、PostGIS 和 ST_Contains 查找包含在多边形内的多边形
- html - VBA - 宏找不到带有 GetElementByTagName 的表
- android - 如何在表中仅存储 100 个元素
- python-3.6 - 如何修复python中的'DataFrame'对象不可调用'错误
- spring - 使用 Vaadin 14 应用程序在 Tomcat 9 上处理 ServletContainerInitializer 期间出错 - 未在 Jetty 上运行,JSR-356 支持不可用
- angular - Angular 8 默认路由
- javascript - React js react-big-calendar momentLocalizer of undefined