【问题标题】:Laravel Spatie Roles and permissions - error on UpdateLaravel Spatie 角色和权限 - 更新错误
【发布时间】:2023-10-03 15:22:01
【问题描述】:

我的 Laravel 应用程序需要帮助。

我使用 spatie 角色和权限。

当我创建用户时,分配角色没问题。当我将更新同一个用户时,会出现以下错误:

[2019-12-06 08:44:36] local.ERROR:给定的角色或权限应使用保护instead of `web`. {"userId":1,"exception":"[object] (Spatie\\Permission\\Exceptions\\GuardDoesNotMatch(code: 0): The given role or permission should use guard 而不是web。在/home/vagrant/code/test/vendor/spatie/laravel-permission/src/Exceptions/GuardDoesNotMatch.php:12)

public function store(StoreUserRequest $request)
{
    $user = $this->repo->create( $request->all());

    $user->assignRole($request->roles);

    return $user;
}

public function update(UpdateUserRequest $request, User $user)
{
    $user = $this->repo->update($user, $request->all());

    $user->assignRole($request->roles);

    return $user;
}

我在用户模型中添加了protected $guard_name = 'web';,但仍然是同样的问题。

怎么了? userId 有问题吗?

【问题讨论】:

  • 如果您尝试删除 tbl models_has_roles 然后将 assignRole() 再次删除给您的用户 DB::table('model_has_roles')->where('model_id',$id)->delete(); 并再次分配角色 $user->assignRole($request->input('roles'));,这可能会很好

标签: laravel roles laravel-permission


【解决方案1】:

当您为用户分配角色时,模型路径 App\User 插入到表 model_has_roles 如果您更改模型文件夹 spatie 会给您一个错误。我认为这段代码可能对您有更多帮助。
不要错过添加HasRoles

class User extends Authenticatable
{

    use Notifiable, HasRoles;
    ...
}

确保导入 use App\User;
UserController

public function update(Request $request, $id)
    {
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required|email|unique:users,email,'.$id,
            'password' => 'same:confirm-password',
            'roles' => 'required'
        ]);


        $input = $request->all();
        if(!empty($input['password'])){ 
            $input['password'] = Hash::make($input['password']);
        }else{
            $input = array_except($input,array('password'));    
        }


        $user = User::find($id);
        $user->update($input);
        DB::table('model_has_roles')->where('model_id',$id)->delete();


        $user->assignRole($request->input('roles'));


        return redirect()->route('users.index')
                        ->with('success','User updated successfully');
    }

【讨论】:

    【解决方案2】:

    在更新方法上使用syncRoles 而不是assignRole

    【讨论】:

    • 用户中有UseRoles吗?
    • 我认为问题在于数组的类型。我将"roles":["User","Admin"] 发送到后端。但是后端创建了一个数组array ( 0 => 'User', 1 => 'Admin', )
    • 对不起,这是我这边的一个错误。一开始,我将用户模型从 App\User 复制到 App\Models\User。我忘了删除旧的。在我的控制器中,我导入了错误的 App\User!
    • 很高兴听到这个消息