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

Laravel 9 + spatie/laravel-permission角色异常:管理员同时拥有用户角色

解决Laravel 9中登录后用户角色叠加的问题

问题原因

你当前在AuthenticatedSessionController的store方法中,每次登录时直接给用户追加角色,而非替换已有角色。如果用户之前已被分配过角色(比如测试时手动添加、登录逻辑重复执行),就会导致多个角色叠加,最终出现admin用户同时拥有admin和user角色的情况。

修复方案

修改登录逻辑,在分配新角色前先清除用户已有的所有角色,再根据id_role分配对应角色。使用Spatie包提供的syncRoles方法可直接替换用户的角色集合,彻底避免角色叠加。

修改AuthenticatedSessionController的store方法

找到登录成功后处理用户的代码段,替换原有的角色分配逻辑:

use Illuminate\Support\Facades\Auth;

public function store(LoginRequest $request)
{
    $request->authenticate();

    $request->session()->regenerate();

    // 获取当前登录用户
    $user = Auth::user();

    // 根据id_role同步角色(直接替换所有已有角色)
    $roleName = match($user->id_role) {
        2 => 'admin',
        1 => 'user',
        default => 'user', // 可选:设置默认角色兜底
    };

    $user->syncRoles([$roleName]);

    return redirect()->intended(RouteServiceProvider::HOME);
}

如果偏好传统if-else写法,也可以用以下代码:

$user = Auth::user();

// 先清除用户所有已有角色
$user->syncRoles([]);

// 根据id_role分配对应角色
if ($user->id_role == 2) {
    $user->assignRole('admin');
} else {
    $user->assignRole('user');
}

额外检查点

  • 确认你的种子文件(DatabaseSeeder和Database2Seeder)中,admin和user角色是独立创建的,没有重复关联权限或角色的逻辑。
  • 如果用户的id_role字段可能被修改,建议在用户模型中添加观察者或使用updated模型事件,当id_role变更时自动同步角色,避免角色与id_role状态不一致的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:42:12