如何在登录具有 Spatie 的 Laravel 权限的用户之前检查用户角色?

Posted

技术标签:

【中文标题】如何在登录具有 Spatie 的 Laravel 权限的用户之前检查用户角色?【英文标题】:How do I check User Role before Logging in A user with Spatie's Laravel-Permission? 【发布时间】:2019-06-24 13:45:14 【问题描述】:

我正在为 ACL 使用 Spatie 的“Laravel Permission”包。一切正常。我现在只想允许用户角色 2 和 3 登录。

以前,在使用“Laravel Permission”包之前,我的表上只有这个“角色”列,我可以在 Login Controller 的凭据方法上使用这行代码轻松登录用户。

protected function credentials(Request $request)

$credentials = $request->only($this->username(), 'password');
//$credentials['role'] = '1';
return $credentials;

$credentials = $request->only($this->username(), 'password');
$credentials['role'] = '1';

如何只允许 2 和 3 个用户角色登录?

【问题讨论】:

你试过中间件吗? 【参考方案1】:

您可以使用以下解决方法:

如果您使用来自App\Http\Controllers\Auth 文件夹的默认LoginController,则覆盖来自所用特征的attemptLogin() 方法。

    protected function attemptLogin(Request $request)
    
        if( $this->guard()->attempt(
            $this->credentials($request), $request->filled('remember')
        ) )  // Credential auth was successful
            // Get user model
            $user = Auth::user();
            return $user->hasRole([2, 3]); // Check if user has role ids 2 or 3
        

        return false;
    

hasRoles() 方法来自HasRoles 用于User 模型的特征。

【讨论】:

谢谢☺,同样适用于角色名称return $user->hasRole(['admin', 'stack overflower']);【参考方案2】:

您可以在 LoginController 中覆盖 authenticated() 并检查用户角色。很简单。

protected function authenticated(Request $request, $user)

    //Check user role, if it is not admin then logout
    if(!$user->hasRole(['Admin', 'Super-Admin']))
    
        $this->guard()->logout();
        $request->session()->invalidate();
        return redirect('/login')->withErrors('You are unauthorized to login');
    

【讨论】:

【参考方案3】:

或者您可以在登录期间覆盖 Laravel 凭据。在来自App\Http\Controllers\Auth 文件夹的默认LoginController 中,然后覆盖来自所用特征的凭据(Request $request) 方法。

覆盖它以使其看起来与此类似

protected function credentials(Request $request)


 return [ 'email' => $request->  this-> username() , 'password' -> $request -> password, 'role_id'  => [ '1', '2' ] ];

这是假设您的用户模型中有role_id。为我工作。返回

【讨论】:

以上是关于如何在登录具有 Spatie 的 Laravel 权限的用户之前检查用户角色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel spatie 中分配多个角色和基于多个角色的权限?

php Spatie Laravel Model状态范围具有状态

php 具有Spatie Peermission包的Laravel Nova用户模型

使用带有 spatie 包的 Laravel 8 尝试获取具有角色问题的用户列表调用未定义的方法 App\Models\User::hasAllRoles()

我如何在 laravel 中为 spatie 包(ACL 管理)中的其他角色分配用户列表权限?

如何使用 laravel 8 +jetstream + spatie 为注册用户分配角色