Laravel 11/12中Sanctum多用户模型SPA认证方案选型咨询
Laravel多SPA认证方案选择建议
针对你提到的同域名下两个Angular SPA(admin/client子域名)对接Laravel API的认证需求,结合两个方案的特点,给你具体分析和建议:
方案1:单User模型+关联专属表
优势
- 完全匹配Laravel Sanctum SPA认证的官方流程,无需额外配置认证守卫,上手快,踩坑少
- 共享User模型的基础认证逻辑(如密码重置、邮箱验证),减少重复代码编写
- 会话管理统一,不用区分不同守卫的会话存储规则
劣势
- User表会逐渐冗余,随着Admin/Client专属字段增多,表结构会变得臃肿、不清晰
- 权限校验依赖
type字段判断,业务代码中容易出现遗漏,比如接口忘记校验用户类型导致越权 - 后续若要给Admin/Client做独立的认证规则(如不同登录方式、token有效期),扩展难度大
方案2:独立认证守卫+多用户模型
优势
- 架构清晰,AdminUser和ClientUser完全隔离,各自的字段、业务逻辑互不干扰
- 权限控制更严谨,通过守卫直接区分用户类型,无需在业务代码中额外做判断
- 扩展性强,后续可给不同守卫配置不同的认证驱动、会话有效期、密码规则等
劣势
- 需要手动配置
config/auth.php的守卫和提供者,官方没有一步到位的完整示例,需自行梳理流程 - 基础认证逻辑(如密码重置)需在两个模型中分别实现,或封装成Trait复用
- 需确保Sanctum的
stateful配置包含两个子域名,保证Cookie跨子域名共享正常
决策建议
- 如果你的项目业务逻辑简单,Admin和Client的认证流程、权限规则差异不大,优先选方案1,快速落地,减少配置成本
- 如果你的项目Admin和Client业务完全独立,后续有明确的扩展需求(如不同登录方式、独立权限体系),建议选方案2,初期配置稍麻烦,但后期维护成本低,架构更健壮
方案2核心配置示例
修改config/auth.php
'guards' => [ 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], 'client' => [ 'driver' => 'session', 'provider' => 'clients', ], ], 'providers' => [ 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\AdminUser::class, ], 'clients' => [ 'driver' => 'eloquent', 'model' => App\Models\ClientUser::class, ], ],
登录控制器中指定守卫
// Admin登录逻辑 if (Auth::guard('admin')->attempt($request->only('email', 'password'))) { // 登录成功后的处理 return response()->json(['message' => 'Admin login success']); } // Client登录逻辑 if (Auth::guard('client')->attempt($request->only('email', 'password'))) { // 登录成功后的处理 return response()->json(['message' => 'Client login success']); }
配置Sanctum跨子域名会话
修改config/sanctum.php,确保stateful包含两个子域名:
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s', 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' )) . ',admin.yourdomain.com,client.yourdomain.com'),
内容的提问来源于stack exchange,提问作者Nelize du Toit
相关产品推荐
相关产品推荐

