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
相关产品推荐
相关产品推荐

