如何让Laravel Auth Policies与API控制器及Form Request协同工作
在Laravel 9的Form Request中使用授权策略的正确方式
不需要在控制器的store/update方法里重复处理授权逻辑,直接在Form Request中整合Policy即可,既能保证授权逻辑的集中管理,又能让代码更简洁。以下是具体操作步骤:
1. 确认Policy已注册
打开app/Providers/AuthServiceProvider.php,确保$policies数组中已添加Post模型与对应Policy的映射:
protected $policies = [ \App\Models\Post::class => \App\Policies\PostPolicy::class, ];
2. 在Form Request中调用Policy授权方法
Laravel的Form Request会在控制器方法执行前自动运行authorize()方法,我们只需在此方法中调用Policy的对应授权逻辑:
新建文章(StorePostRequest)
打开app/Http/Requests/StorePostRequest.php,修改authorize()方法:
public function authorize() { // 调用PostPolicy中的create方法验证当前用户权限 return $this->user()->can('create', \App\Models\Post::class); }
更新文章(UpdatePostRequest)
打开app/Http/Requests/UpdatePostRequest.php,修改authorize()方法:
public function authorize() { // 获取路由中对应的Post实例 $post = \App\Models\Post::findOrFail($this->route('post')); // 调用PostPolicy中的update方法验证权限 return $this->user()->can('update', $post); }
3. 完善Policy中的授权规则
打开app/Policies/PostPolicy.php,根据业务需求编写具体的授权逻辑:
public function create(\App\Models\User $user) { // 示例:仅管理员或拥有创建权限的用户可新建文章 return $user->is_admin || $user->hasPermission('create_post'); } public function update(\App\Models\User $user, \App\Models\Post $post) { // 示例:仅文章作者或管理员可修改文章 return $user->id === $post->user_id || $user->is_admin; }
4. 控制器保持简洁逻辑
因为Form Request会自动完成验证和授权,控制器的store/update方法无需再处理授权,直接专注业务逻辑:
public function store(StorePostRequest $request) { \App\Models\Post::create($request->validated()); return response()->json(['message' => '文章创建成功'], 201); } public function update(UpdatePostRequest $request, \App\Models\Post $post) { $post->update($request->validated()); return response()->json(['message' => '文章更新成功']); }
注意事项
- 若API使用无状态认证(如Token),需确保
config/auth.php中apiguard配置正确,保证$this->user()能正常获取当前用户。 - 授权失败时,Laravel会自动返回
403 Forbidden响应,无需手动处理。
内容的提问来源于stack exchange,提问作者wanna_coder101
相关产品推荐
相关产品推荐

