Предотвращение входа в систему с помощью Laravel's Auth - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь запретить пользователю войти в систему при некоторых условиях.

Моя идея состоит в том, чтобы выполнить некоторые дополнительные проверки после использования системы аутентификации Laravel. Что касается систем входа / регистрации и восстановления паролей, все работает отлично. Но я не могу выйти из системы и показать пользовательскую ошибку на странице входа.

Все, что я хочу сделать, это показать специальное сообщение "Ваша учетная запись была приостановлена" в поле "адрес электронной почты", после проверки, был ли пользователь приостановлен или нет.

enter image description here

Мой код (HomeController), а также некоторые из моих решений:

public function index(Request $request)
{
        // After Laravel logs the user through its authentication system
        $user = Auth::user();
        if (!isset($user)) {
            return redirect('/');

        } else {    
            // we perform some checks of our own
            if ($user->suspended != 0) { // suspended by an administrator
                $error = trans('errors_login.SUSPENDED_BY_ADMIN');

               // return redirect()->route('logout', array('error_msg' => $error));

               // return redirect()->route('logout')->withErrors('email','There was an error'); // trying to replace the "email" error


               Auth::logout();

               $error = ['loginError'=> trans('errors_login.SUSPENDED_BY_ADMIN')];
               return view('auth.login', $error);


            }
        }
...

Просто чтобы уточнить, что такое маршрут выхода из системы:

Route::get('/logout', '\App\Http\Controllers\Auth\LoginController@logout');

Я использую сгенерированное представление входа в систему Laravel:

...

<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">E-Mail Address</label>

<div class="col-md-6">
    <input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required autofocus>

    @if ($errors->has('email'))
        <span class="invalid-feedback" role="alert">
            <strong>{{ $errors->first('email') }}</strong>
        </span>
    @endif
</div>

Кажется, ничего не работает. Я довольно новичок в Laravel, поэтому я должен что-то упустить.

Спасибо.

1 Ответ

0 голосов
/ 13 января 2019

Контроллер входа в систему Laravel по умолчанию (App\Http\Controller\Auth\LoginController) использует черту AuthenticatesUsers под капотом.

Таким образом, всякий раз, когда пользователь проходит аутентификацию, он вызывает метод authenticated() перед отправкой ответа на вход в систему, что означает, что вы, вероятно, могли бы сделать что-то подобное.

В App\Http\Controller\Auth\LoginController добавьте новый authenticated() метод, который переопределяет AuthenticatesUsers::authenticated().

protected function authenticated(Request $request, $user)
{
    if ($user->suspended) {
        Auth::logout();

        return back()
            ->with('loginError', trans('errors_login.SUSPENDED_BY_ADMIN'));
    }

    return redirect()->intended($this->redirectPath());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...