Разрешить различным пользователям войти через laravel - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть таблица базы данных с users и специальное поле с именем status, которое будет иметь три значения:

0 - Для пользователя, который зарегистрирован, но не имеет доступа, пока администратор не изменит свой статус1. 1. 1006 *

1 - Для пользователя normal, который зарегистрирован и утвержден.

2 - Это статус для пользователя admin.

Итак, теперь я хочу позволить тем, кто имеет статус 1 (normal пользователь) и 2 (admin пользователь), войти в систему, но, очевидно, я не могу сделать это с помощью этого метода, который я добавляю в LoginController.

Я должен передать только ['status' => 1] или ['status' => 2], но не оба, и это помешает пользователям или администраторам войти в систему.

Кто-нибудь может мне помочь?

 protected function credentials(Request $request)
    {
        return array_merge($request->only($this->username(), 'password'),
        (['status' => 1]) || (['status' => 2]));
    }

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Самый простой способ - переписать метод authenticated () в LoginController, который выполняется при успешном входе пользователя в систему:

protected function authenticated(Request $request, $user)
{
    if (in_array($user->status, [1, 2])) {
        return redirect()->intended($this->redirectPath());
    }

    auth()->logout();

    return redirect('/login')->withErrors(['email' => 'You can not login.']);
}

Таким образом, вы можете проверить, если пользовательимеет правильный статус, и если это не так, вы можете выйти и перенаправить с сообщением об ошибке.Не забудьте импортировать use Illuminate\Http\Request; вверху.

Если вам нужно другое решение, в котором вы фактически проверяете статус пользователя перед попыткой входа в систему, в методах по умолчанию много изменений.

0 голосов
/ 18 сентября 2018

Это решение, которое решит вашу проблему входа в систему, а также защитит ваши маршруты от прямых посещений неавторизованными пользователями.Если все, что вам нужно, это просто заблокировать фактический вход в систему, посмотрите другой ответ от @thefallen.Но если вам нужна дополнительная защита, кроме формы входа, вы можете обернуть ВСЕ ваши защищенные маршруты в промежуточное ПО, которое проверяет, равен ли «статус» пользователя 1 или 2. Если это не так, вы можете войти в нихиз.Это на самом деле не блокирует их вход в интерфейс, но гарантирует, что пользователь, который не одобрен, не может получить доступ к защищенным маршрутам и будет немедленно отключен, когда они это сделают.Предполагая, что вы перенаправляете своих пользователей на защищенный маршрут при входе в систему, промежуточное ПО будет эффективно выходить из системы сразу же по первому запросу.Промежуточное программное обеспечение может выглядеть следующим образом:

class AuthorizedUser
{
    public function handle($request, Closure $next)
    {
        if(Auth::check() && !in_array(Auth::user()->status, [1, 2])) {
            Auth::logout();
            abort(404);
        } else if(Auth::check()) {
            return $next($request);
        } else {
            abort(404);
        }
    }
}

Тогда вы можете использовать массив $ middelwareGroups для переноса ваших защищенных маршрутов в это промежуточное программное обеспечение, что-то вроде этого в файле Http \ Kernel.php:

protected $middlewareGroups = [
    'authorized' => [
        \App\Http\Middleware\AuthorizedUser::class,
    ]
];

Вы можете изменить функциональность 404 на любое другое, например перенаправить обратно на страницу входа или на домашнюю страницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...