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

Laravel Sanctum多租户API下超级管理员Master密钥实现方案咨询

第二种方案完全可行,你可以通过自定义Sanctum的认证逻辑,配合Tenancy for Laravel的租户识别流程实现全局生效的Master密钥,具体实现方案如下:

前置调整

首先在中心域数据库的personal_access_tokens表新增is_master_key字段,类型为tinyint(1),默认值为0,用于标记该令牌是否为全局生效的超级管理员Master密钥。超级管理员在中心域登录颁发令牌时,将该字段设为1即可。

核心实现步骤

  1. 自定义Sanctum认证逻辑
    在app/Providers/AuthServiceProvider.php的boot方法中,重写Sanctum的令牌校验逻辑:当请求携带的令牌属于Master密钥时,直接查询中心域数据库的令牌表校验有效性,无需查询当前租户的私有数据库;校验通过后直接返回中心域的超级管理员用户实例作为认证用户。
    示例代码如下:
use Laravel\Sanctum\Sanctum;
use App\Models\Central\User; // 中心域超级管理员模型

public function boot()
{
    $this->registerPolicies();

    Sanctum::authenticateAccessTokensUsing(function ($accessToken, $isValid) {
        // 先判断是否是Master密钥
        if ($accessToken->is_master_key) {
            // 校验对应用户是否为超级管理员,令牌未过期
            return $accessToken->tokenable instanceof User 
                && $accessToken->expires_at?->isFuture() !== false;
        }
        // 普通租户令牌走原有校验逻辑
        return $isValid;
    });
}
  1. 调整中间件顺序
    将Tenancy for Laravel的租户初始化中间件放在Sanctum认证中间件之前执行,保证请求到达认证逻辑时,已经完成当前租户的上下文识别,后续业务代码可以正常访问对应租户的私有数据库。
    你可以在app/Http/Kernel.php中调整中间件组的顺序:
protected $middlewareGroups = [
    'api' => [
        \Stancl\Tenancy\Middleware\InitializeTenancyByDomain::class, // 先识别租户
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Illuminate\Auth\Middleware\Authenticate::class.':sanctum', // 后做认证
    ],
];
  1. Lighthouse兼容配置
    你不需要额外修改Lighthouse的配置,只要Lighthouse的guard配置为sanctum,就能直接复用上述认证逻辑,GraphQL请求也可以正常识别Master密钥。

可选优化项

  • 新增操作日志中间件,记录所有使用Master密钥的请求操作,便于后续安全审计
  • 为Master密钥设置更短的过期时间,默认建议不超过2小时,降低密钥泄露后的风险
  • 如果需要限制超级管理员只能访问指定租户,可以在中心域数据库新增超级管理员与租户的关联表,在Sanctum自定义认证逻辑中增加租户归属校验即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 17:15:06