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

使用auth:sanctum中间件时Spatie角色权限报GuardDoesNotMatch错误如何解决

问题原因

当请求走auth:sanctum中间件时,Laravel会将当前请求的默认guard临时切换为sanctum。Spatie Permission扩展包默认会校验当前请求的guard与角色/权限存储的guard_name字段是否一致,你所有角色权限的guard_name都是web,因此触发GuardDoesNotMatch异常。
之前新建用户时分配权限正常,是因为对应操作运行在web guard的路由上下文下,guard匹配校验通过。

可行解决方案

以下三种方案可根据你的业务场景选择:

方案1:重写User模型的默认Guard方法(最推荐,无需修改现有数据)

直接在app/Models/User.php中添加以下方法,强制让Spatie Permission包统一使用web guard做权限校验:

public function getDefaultGuardName(): string
{
    return 'web';
}

该方案适配性最高,只要你的用户体系和web guard共用同一个用户表,就不会有额外安全问题,也不需要修改数据库中已存储的角色权限数据。

方案2:分配角色/权限时手动指定Guard

如果只是偶尔在sanctum路由下做权限分配操作,可以在调用相关方法时手动传入guard名称:

// 分配角色
$user->assignRole('管理员', 'web');
// 分配权限
$user->givePermissionTo('上传excel', 'web');

方案3:修改Spatie Permission配置允许多Guard共用

如果你的业务确实需要同时在web和sanctum guard下使用同一套角色权限,先发布配置文件(如果未发布过):

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

打开config/permission.php,修改以下配置:

// 允许多个guard共用同一套权限角色
'allow_multiple_guards' => true,

然后在配置的guard_names项中添加sanctum:

'guard_names' => [
    'web',
    'sanctum',
],
验证

修改完成后执行php artisan config:clear清除配置缓存,再测试sanctum路由下的权限分配操作即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:27:04