Laravel 5.6:基于请求参数校验用户创建记录权限
嘿,这事儿不难!把权限校验从控制器移到FormRequest或者EventPolicy都是很规范的做法,我给你详细讲讲两种方案,你可以选适合自己的:
方案1:用FormRequest(EventRequest)做权限校验
这种方式适合把请求验证和权限校验放在同一个地方,Laravel会在请求到达控制器之前自动处理:
- 首先生成专门的请求类(比如用于创建Event的
EventStoreRequest):php artisan make:request EventStoreRequest - 打开生成的
app/Http/Requests/EventStoreRequest.php,修改authorize()方法来实现权限校验,同时在rules()里定义字段验证规则:<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Auth; class EventStoreRequest extends FormRequest { /** * 确定用户是否有权限提交此请求 */ public function authorize(): bool { // 从请求中获取关联的organiser_id $organiserId = $this->input('organiser_id'); // 调用User模型中预先定义的权限检查方法 return Auth::user()->hasAccessToOrganiser($organiserId); } /** * 定义请求字段的验证规则 */ public function rules(): array { return [ 'organiser_id' => 'required|exists:organisers,id', // 这里添加其他Event字段的验证规则,比如: // 'title' => 'required|string|max:255', // 'start_time' => 'required|date', ]; } } - 最后在控制器的
store方法里直接使用这个请求类,不用再写权限校验代码:public function store(EventStoreRequest $request) { // 请求已经通过了验证和权限校验,直接创建Event即可 $event = Auth::user()->events()->create($request->validated()); return redirect()->route('events.show', $event); }
方案2:用EventPolicy做权限校验
如果希望把所有和Event相关的权限逻辑统一管理,用Policy是更好的选择:
- 首先生成EventPolicy:
php artisan make:policy EventPolicy --model=Event - 打开
app/Policies/EventPolicy.php,定义create方法(因为是创建Event,还没有模型实例,所以需要接收organiser_id参数):<?php namespace App\Policies; use App\Models\Event; use App\Models\User; use Illuminate\Auth\Access\Response; class EventPolicy { /** * 确定用户是否可以创建Event */ public function create(User $user, int $organiserId): bool { // 同样调用User模型的权限检查方法 return $user->hasAccessToOrganiser($organiserId); } } - 然后在控制器里调用Policy进行校验,这里可以结合普通的请求验证,或者和FormRequest配合:
public function store(Request $request) { // 先验证请求字段 $validated = $request->validate([ 'organiser_id' => 'required|exists:organisers,id', // 其他字段规则... ]); // 调用Policy的create方法进行权限校验,第一个参数是权限动作,第二个参数是模型类+organiser_id $this->authorize('create', [Event::class, $validated['organiser_id']]); // 创建Event Event::create($validated); return redirect()->route('events.index'); } - 如果你想结合FormRequest和Policy,也可以在FormRequest的
authorize()方法里调用Policy:public function authorize(): bool { $organiserId = $this->input('organiser_id'); return $this->user()->can('create', [Event::class, $organiserId]); }
补充:User模型的权限检查方法
不管用哪种方案,你都需要在User模型里定义hasAccessToOrganiser方法,根据你的实际关联关系来实现:
// app/Models/User.php public function hasAccessToOrganiser(int $organiserId): bool { // 示例1:如果用户和Organiser是多对多关系(比如用户是多个Organiser的管理员) return $this->organisers()->where('organisers.id', $organiserId)->exists(); // 示例2:如果用户属于单个Organiser(一对一/一对多关系) // return $this->organiser_id === $organiserId; }
内容的提问来源于stack exchange,提问作者Craig Blackie
相关产品推荐
相关产品推荐

