Laravel使用Spatie包查询特定角色/权限ID时出现Sanctum Guard错误
问题解决:Laravel Sanctum + Spatie ACL 查询特定角色/权限ID时的Guard错误
问题原因
Spatie的findById()、findByName()这类方法会默认使用配置文件中指定的Guard(默认值为web),而你的API使用的是Sanctum Guard,两者不匹配导致权限校验失败。而查询全部角色/权限用的是普通Eloquent查询,不涉及Guard校验逻辑,因此可以正常运行。
解决方案
方案1:全局设置默认Guard为Sanctum
修改config/permission.php配置文件,找到default_guard项,将其值改为sanctum:
'default_guard' => 'sanctum',
修改后执行配置缓存刷新:
php artisan config:cache
方案2:调用方法时显式指定Guard
如果需要保留多Guard场景(比如同时支持web页面和sanctum API),可以在调用findById()时传入Sanctum Guard作为第二个参数:
public function create() { $role = Role::orderBy('id', 'DESC')->get(); // 第二个参数指定使用sanctum guard $role_user = Role::findById(3, 'sanctum'); return response([ 'status' => true, 'role' => $role, 'role_user' => $role_user ], 200); }
方案3:确保权限配置包含Sanctum Guard
检查config/permission.php中的guards数组,确认已添加sanctum配置:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'sanctum' => [ 'driver' => 'sanctum', 'provider' => 'users', ], ],
同时确认config/auth.php中providers配置指向正确的User模型:
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], ],
内容的提问来源于stack exchange,提问作者Labeeque Sarwar
相关产品推荐
相关产品推荐

