Laravel REST接口按角色保护指定方法,求替代Sanctum的方案
Laravel API路由保护的替代方案
针对你的场景,以下几种方案可以替代Sanctum,适配不同的部署和需求:
1. Laravel Passport(密码授权模式)
适合前后端分离、需要细粒度角色权限控制的场景,功能完整且官方维护。
- 安装与配置:
- 安装依赖:
composer require laravel/passport - 执行迁移与初始化命令:
php artisan migrate && php artisan passport:install - 在
User模型中引入HasApiTokenstrait - 修改
config/auth.php,将apiguard的driver设置为passport
- 安装依赖:
- 认证流程:
- 登录接口验证用户账号密码后,返回访问令牌:
return $user->createToken('MemberManageToken')->accessToken - React端请求时,将令牌放在请求头:
Authorization: Bearer {token}
- 登录接口验证用户账号密码后,返回访问令牌:
- 路由保护:
- 用
auth:api中间件包裹需要保护的路由组,结合can中间件实现角色权限校验:Route::middleware(['auth:api', 'can:manage-members'])->group(function () { Route::post('/members', [MemberController::class, 'store']); Route::put('/members/{id}', [MemberController::class, 'update']); });
- 用
2. 自定义Token认证
适合轻量需求,完全自主控制认证逻辑,避免依赖额外扩展包。
- 实现步骤:
- 给
users表添加api_token(唯一字符串)和token_expires_at(时间戳)字段 - 登录时生成随机令牌:
$token = Str::random(60),将其与过期时间(比如7天)存入用户记录 - 创建自定义中间件
ApiTokenAuth,在中间件中从请求头获取令牌,查询并验证用户:
public function handle(Request $request, Closure $next) { $token = $request->header('Authorization') ? str_replace('Bearer ', '', $request->header('Authorization')) : null; if (!$token) { return response()->json(['message' => 'Unauthorized'], 401); } $user = User::where('api_token', $token)->where('token_expires_at', '>', now())->first(); if (!$user) { return response()->json(['message' => 'Invalid or expired token'], 401); } Auth::setUser($user); return $next($request); }- 在
app/Http/Kernel.php中注册中间件,然后用它保护路由,配合can中间件做权限控制
- 给
3. Session认证(同域部署场景)
如果你的React后台与Laravel项目同域部署(比如React打包后放到Laravel的public目录),直接用Laravel默认的Session认证最省心。
- 配置与使用:
- 确保
config/sanctum.php的stateful数组包含你的域名(同域情况下默认配置即可) - 路由使用
webguard的auth中间件保护:
Route::middleware('auth')->group(function () { Route::get('/members', [MemberController::class, 'index']); Route::delete('/members/{id}', [MemberController::class, 'destroy']); });- React端发送请求时,浏览器会自动携带Laravel的Session Cookie,无需手动处理令牌,权限控制同样通过
can中间件实现
- 确保
4. Laravel Breeze(API模式)
如果你只是觉得Sanctum配置繁琐,Breeze的API模式提供了轻量封装的认证脚手架,底层基于Sanctum但无需手动配置复杂流程。
- 快速搭建:
- 安装Breeze:
composer require laravel/breeze --dev - 生成API认证代码:
php artisan breeze:install api - 生成的代码包含登录、注册、令牌刷新、登出的完整接口,直接返回JWT格式的访问令牌
- 用
auth:sanctum中间件保护路由,配合Laravel的权限系统实现角色校验
- 安装Breeze:
内容的提问来源于stack exchange,提问作者fefe
相关产品推荐
相关产品推荐

