You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:06:40