Вход только в том случае, если пользователь активен, используя Laravel

Я сейчас работаю над своим приложением Laravel и предотвращаю спам. Я решил, что только активные пользователи могут войти в систему. В настоящее время я использую систему входа в систему Laravel, как в официальном учебном пособии Laravel, вот моя форма:

<form class="form-horizontal" role="form" method="POST" action="{{ url('/auth/login') }}"> 

Это работает совершенно нормально, однако я бы хотел проверить активный пользователь, если он неактивен, он будет перенаправлен на страницу активации, иначе он будет входить в систему. Есть ли простой способ сделать это, или я обязан создать новый контроллер, маршруты и другие проверки? Спасибо.

Изменить: Забыл упомянуть, что у меня есть «активный» столбец в моей базе данных.

Related of "Вход только в том случае, если пользователь активен, используя Laravel"

Laravel 5.4 / 5.5

Переопределите функцию login() по умолчанию, поместив эту функцию в свой LoginController :

 public function login(\Illuminate\Http\Request $request) { $this->validateLogin($request); // If the class is using the ThrottlesLogins trait, we can automatically throttle // the login attempts for this application. We'll key this by the username and // the IP address of the client making these requests into this application. if ($this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); return $this->sendLockoutResponse($request); } // This section is the only change if ($this->guard()->validate($this->credentials($request))) { $user = $this->guard()->getLastAttempted(); // Make sure the user is active if ($user->active && $this->attemptLogin($request)) { // Send the normal successful login response return $this->sendLoginResponse($request); } else { // Increment the failed login attempts and redirect back to the // login form with an error message. $this->incrementLoginAttempts($request); return redirect() ->back() ->withInput($request->only($this->username(), 'remember')) ->withErrors(['active' => 'You must be active to login.']); } } // If the login attempt was unsuccessful we will increment the number of attempts // to login and redirect the user back to the login form. Of course, when this // user surpasses their maximum number of attempts they will get locked out. $this->incrementLoginAttempts($request); return $this->sendFailedLoginResponse($request); } 

Переопределение метода login() таким образом рекомендуется по многим другим ответам на этот вопрос, поскольку он позволяет вам использовать многие из более расширенных функций аутентификации Laravel 5.4+, такие как регулирование входа в систему, несколько драйверов / поставщиков проверки подлинности, и т. д., все еще позволяя вам установить настраиваемое сообщение об ошибке.


Laravel 5.3

Измените или переопределите postLogin() в вашем AuthController чтобы выглядеть так:

 public function postLogin(Request $request) { $this->validate($request, [ 'email' => 'required|email', 'password' => 'required', ]); $credentials = $this->getCredentials($request); // This section is the only change if (Auth::validate($credentials)) { $user = Auth::getLastAttempted(); if ($user->active) { Auth::login($user, $request->has('remember')); return redirect()->intended($this->redirectPath()); } else { return redirect($this->loginPath()) // Change this to redirect elsewhere ->withInput($request->only('email', 'remember')) ->withErrors([ 'active' => 'You must be active to login.' ]); } } return redirect($this->loginPath()) ->withInput($request->only('email', 'remember')) ->withErrors([ 'email' => $this->getFailedLoginMessage(), ]); } 

Этот код перенаправляет обратно на страницу входа с сообщением об ошибке, когда пользователь неактивен. Если вы хотите перенаправить на страницу аутентификации, вы измените строку, помеченную комментарием. Change this to redirect elsewhere .

В Laravel 5.4 открыть Auth / LoginController.php

и добавьте эту функцию:

 /** * Get the needed authorization credentials from the request. * * @param \Illuminate\Http\Request $request * @return array */ protected function credentials(\Illuminate\Http\Request $request) { //return $request->only($this->username(), 'password'); return ['email' => $request->{$this->username()}, 'password' => $request->password, 'status' => 1]; } 

И все готово ..!

Это решение основано на идее Can Celik и было протестировано с Laravel 5.3.

 protected function validateLogin(Request $request) { $this->validate($request, [ $this->username() => 'required|exists:users,' . $this->username() . ',active,1', 'password' => 'required', ]); } 

Последние два параметра, разделенные запятыми ( active,1 ), действуют как предложение WHERE ( WHERE active = '1' ) и могут быть альтернативно записаны следующим образом:

 protected function validateLogin(Request $request) { $this->validate($request, [ $this->username() => [ 'required', Rule::exists('users')->where(function ($query) { $query->where('active', 1); }), ], 'password' => 'required' ]); } 

Обычно метод проверки проверяет только заполнение полей электронной почты и пароля. С изменением выше мы требуем, чтобы данный адрес электронной почты был найден в строке DB с active значением, установленным в 1.

ОБНОВИТЬ:

Вы также можете настроить сообщение:

 protected function validateLogin(Request $request) { $this->validate($request, [ $this->username() => 'required|exists:users,' . $this->username() . ',active,1', 'password' => 'required', ], [ $this->username() . '.exists' => 'The selected email is invalid or the account has been disabled.' ]); } 

Обратите внимание, что указанное выше сообщение будет отображаться как при отсутствии адреса электронной почты, так и при отключении учетной записи.

в AuthController переопределяет метод getCredentials следующим образом:

 protected function getCredentials(Request $request) { $request['active'] = TRUE; return $request->only($this->loginUsername(), 'password', 'active'); } 

убедитесь, что столбец активен в таблице пользователя …

Вам не нужно переопределять всю функцию. Вы можете просто изменить Validator в AuthController, чтобы добиться того, что добавление проверки «существует: таблица, столбец».

Предположим, что у вас есть таблица пользователей с электронной почтой, паролем и активными полями.

  'email' => 'существует: пользователи, адрес электронной почты, активный, 1' 

Вот функция validotor должна выглядеть как в AuthController.php

 protected function validator(array $data) { return Validator::make($data, [ 'email' => 'required|email|max:255|exists:users,email,active,1', 'password' => 'required|confirmed' ]); } 

или если вы используете мягкие удаления, это тоже должно работать.

  'email' => 'существует: пользователи, электронная почта, deleted_at, NULL' 

Вы также можете проверить правило проверки по этой ссылке http://laravel.com/docs/5.1/validation#rule-exists

В случае, если кто-то пришел сюда, ища информацию о Laravel 5.4 / 5.5, и это позволяет использовать настраиваемое сообщение только для этого сценария (а не комбинированное сообщение), вот ответ на этот вопрос: https://laracasts.com/discuss/channels/ Laravel / пользовательский счет-статус

Переопределите метод «authenticated» в файле your'app / Http / Controllers / Auth / LoginController.php:

 /** * The user has been authenticated. * * @param \Illuminate\Http\Request $request * @param mixed $user * @return mixed */ protected function authenticated(Request $request, $user) { if ($user->status_id == 2) { // or whatever status column name and value indicates a blocked user $message = 'Some message about status'; // Log the user out. $this->logout($request); // Return them to the log in form. return redirect()->back() ->withInput($request->only($this->username(), 'remember')) ->withErrors([ // This is where we are providing the error message. $this->username() => $message, ]); } } из /** * The user has been authenticated. * * @param \Illuminate\Http\Request $request * @param mixed $user * @return mixed */ protected function authenticated(Request $request, $user) { if ($user->status_id == 2) { // or whatever status column name and value indicates a blocked user $message = 'Some message about status'; // Log the user out. $this->logout($request); // Return them to the log in form. return redirect()->back() ->withInput($request->only($this->username(), 'remember')) ->withErrors([ // This is where we are providing the error message. $this->username() => $message, ]); } }