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

Laravel REST接口按角色保护指定方法,求替代Sanctum的方案

Laravel API路由保护的替代方案

针对你的场景,以下几种方案可以替代Sanctum,适配不同的部署和需求:

1. Laravel Passport(密码授权模式)

适合前后端分离、需要细粒度角色权限控制的场景,功能完整且官方维护。

  • 安装与配置:
    1. 安装依赖:composer require laravel/passport
    2. 执行迁移与初始化命令:php artisan migrate && php artisan passport:install
    3. 在User模型中引入HasApiTokens trait
    4. 修改config/auth.php,将api guard的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认证

适合轻量需求,完全自主控制认证逻辑,避免依赖额外扩展包。

  • 实现步骤:
    1. 给users表添加api_token(唯一字符串)和token_expires_at(时间戳)字段
    2. 登录时生成随机令牌:$token = Str::random(60),将其与过期时间(比如7天)存入用户记录
    3. 创建自定义中间件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);
    }
    
    1. 在app/Http/Kernel.php中注册中间件,然后用它保护路由,配合can中间件做权限控制

3. Session认证(同域部署场景)

如果你的React后台与Laravel项目同域部署(比如React打包后放到Laravel的public目录),直接用Laravel默认的Session认证最省心。

  • 配置与使用:
    1. 确保config/sanctum.php的stateful数组包含你的域名(同域情况下默认配置即可)
    2. 路由使用web guard的auth中间件保护:
    Route::middleware('auth')->group(function () {
        Route::get('/members', [MemberController::class, 'index']);
        Route::delete('/members/{id}', [MemberController::class, 'destroy']);
    });
    
    1. React端发送请求时,浏览器会自动携带Laravel的Session Cookie,无需手动处理令牌,权限控制同样通过can中间件实现

4. Laravel Breeze(API模式)

如果你只是觉得Sanctum配置繁琐,Breeze的API模式提供了轻量封装的认证脚手架,底层基于Sanctum但无需手动配置复杂流程。

  • 快速搭建:
    1. 安装Breeze:composer require laravel/breeze --dev
    2. 生成API认证代码:php artisan breeze:install api
    3. 生成的代码包含登录、注册、令牌刷新、登出的完整接口,直接返回JWT格式的访问令牌
    4. 用auth:sanctum中间件保护路由,配合Laravel的权限系统实现角色校验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:16:20