Как проверить роль пользователя перед входом в систему пользователя с разрешением Laravel от Spatie?

Я использую пакет Spatie «Laravel Permission» для ACL. Все работает отлично. Теперь я хочу разрешить вход в систему только для ролей пользователей 2 и 3.

Раньше, до использования пакета «Laravel Permission», в моей таблице был только этот столбец «role», и я мог легко войти в систему пользователя с помощью этой строки кода в методе учетных данных контроллера входа.

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 ролей пользователей?


person ask_alab    schedule 24.06.2019    source источник
comment
Вы пробовали использовать промежуточное ПО?   -  person Frédéric Klee    schedule 24.06.2019


Ответы (3)


Вы можете использовать обходной путь следующим образом:

Если вы используете значение по умолчанию LoginController из папки App\Http\Controllers\Auth, переопределите его метод 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.

person Thepeanut    schedule 24.06.2019
comment
Спасибо ☺, то же самое касается имен ролей return $user->hasRole(['admin', 'stack overflower']); - person Pathros; 03.12.2019

Вы можете переопределить Authenticated () в LoginController и проверить роль пользователя. Довольно просто.

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');
    }
}
person Rizwan Saleem    schedule 06.12.2019

Или вы можете переопределить учетные данные Laravel во время входа в систему. По умолчанию LoginController из папки App\Http\Controllers\Auth, затем переопределите метод его учетных данных (Request $request), который исходит из используемой черты.

Переопределите его, чтобы он выглядел примерно так

protected function credentials(Request $request)
{

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

Предполагается, что у вас есть role_id в вашей пользовательской модели. Работал на меня. Возврат

person Stanley sunjoy    schedule 24.11.2019