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

Laravel 11 Sanctum带条件用户认证:优化CRUD控制器权限判断

几种更简洁的Laravel权限控制实现方式

针对你需要限制user_type !=5的用户才能写入数据库的需求,不用if包裹整个函数逻辑,可以用以下几种Laravel原生的优雅方案:

1. 使用授权策略(Policy)

这是Laravel推荐的细粒度权限控制方式,适合将权限逻辑和控制器解耦:

  • 生成对应模型的策略文件:
    php artisan make:policy UserWritePolicy --model=User
    
  • 在app/Policies/UserWritePolicy.php里定义写入权限的判断逻辑:
    public function create(User $user)
    {
        // 对应创建操作的权限
        return $user->user_type != 5;
    }
    
    public function update(User $user)
    {
        // 对应更新操作的权限
        return $user->user_type != 5;
    }
    
    public function delete(User $user)
    {
        // 对应删除操作的权限
        return $user->user_type != 5;
    }
    
  • 在控制器的CRUD方法开头调用授权:
    public function store(Request $request)
    {
        // 自动验证当前用户是否有create权限,不满足直接抛出403
        $this->authorize('create', User::class);
        
        // 你的写入逻辑
    }
    

2. 使用表单请求验证(Form Request)

如果需要同时处理请求验证和权限判断,可以用表单请求类:

  • 创建表单请求类:
    php artisan make:request StoreUserRequest
    
  • 在app/Http/Requests/StoreUserRequest.php的authorize()方法里写权限判断:
    public function authorize()
    {
        // 获取当前认证用户
        $user = $this->user();
        return $user->user_type != 5;
    }
    
    // 同时可以在这里定义请求验证规则
    public function rules()
    {
        return [
            // 你的验证规则
        ];
    }
    
  • 控制器方法直接注入这个请求类,自动完成授权和验证:
    public function store(StoreUserRequest $request)
    {
        // 走到这里说明权限和验证都通过了,直接写逻辑
    }
    

3. 自定义中间件

如果多个控制器或路由都需要这个权限限制,用中间件更高效:

  • 生成中间件:
    php artisan make:middleware AllowWriteAccess
    
  • 在app/Http/Middleware/AllowWriteAccess.php的handle()方法里判断权限:
    public function handle(Request $request, Closure $next)
    {
        if (auth()->user()->user_type == 5) {
            abort(403, '无写入数据库权限');
        }
        return $next($request);
    }
    
  • 在app/Http/Kernel.php的$routeMiddleware里注册中间件:
    protected $routeMiddleware = [
        // ...其他中间件
        'allow.write' => \App\Http\Middleware\AllowWriteAccess::class,
    ];
    
  • 给需要限制的路由或控制器方法绑定中间件:
    // 路由组方式
    Route::resource('users', UserController::class)->middleware('allow.write')->only(['store', 'update', 'destroy']);
    
    // 控制器构造方法方式
    public function __construct()
    {
        $this->middleware('allow.write')->only(['store', 'update', 'destroy']);
    }
    

关于Sanctum的补充:Sanctum主要负责API的认证(让你能通过auth()->user()拿到当前用户),权限判断还是依赖Laravel本身的授权体系,上面的所有方案都可以和Sanctum兼容。如果觉得Sanctum文档不够详尽,直接结合Laravel官方的授权、表单请求文档来使用即可,核心逻辑和Web端的权限控制是一致的。

内容的提问来源于stack exchange,提问作者DoINeedANameTho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:26:01