Вход только в том случае, если пользователь активен с помощью Laravel
в настоящее время я работаю над своим приложением Laravel и для предотвращения спама я решил, что только активные пользователи могут войти в систему. В настоящее время я использую систему входа Laravel, как и в официальном веб-сайте Laravel, вот мое действие формы:
<form class="form-horizontal" role="form" method="POST" action="{{ url('/auth/login') }}">
это работает полностью нормально, однако я хотел бы проверить активность пользователя, если он не активен, он будет перенаправлен на страницу активации, иначе он войдет в систему. Есть простой способ сделать это или я обязан сделать новый контроллер, маршруты и другие проверки? Спасибо.
Edit: забыл упомянуть, что у меня есть "активный" столбец в моей базе данных.
8 ответов
в 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.
обновление (протестировано с Laravel 5.5):
вы также можете настроить сообщение:
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');
}
убедитесь, что столбец активен в пользовательской таблице...
вам не нужно переопределять всю функцию. Вы можете просто изменить валидатор в AuthController, чтобы добиться того, что добавление" существует:таблица,столбец " проверка.
предположим, что у вас есть таблица пользователей с электронной почтой, паролем и активными полями.
'email' => 'exists:users,email,active,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' => 'exists:users,email,deleted_at,NULL'
вы также можете проверить правило проверки по этой ссылке http://laravel.com/docs/5.1/validation#rule-exists
Я проверяю, что пользователь активирован функцией перезаписи sendLoginResponse в LoginController
protected function sendLoginResponse(Request $request)
{
if($this->guard()->user()->active == 0){
$this->guard()->logout();
return redirect()->back()
->withInput($request->only($this->username(), 'remember'))
->withErrors(['active' => 'User in not activated.']);
}
$request->session()->regenerate();
$this->clearLoginAttempts($request);
return $this->authenticated($request, $this->guard()->user())
?: redirect()->intended($this->redirectPath());
}
Если кто-то использует ajax-запрос при входе в систему и хочет иметь пользовательское сообщение, Вот как я достиг этого в контроллер входа:
функция login ()
// 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->status == 1 && $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 $this->sendFailedLoginResponse($request, true);
}
}
и другие функции
public function sendLoginResponse(Request $request)
{
$redirectTo = false;
if ($request->headers->get('referer') == env('APP_URL') . '/' || $request->headers->get('referer') == env('APP_URL') . '/login') {
$redirectTo = $this->redirectPath();
}
if ($request->expectsJson()) {
return response()->json(['status' => true, 'user' => auth()->user(), 'redirectTo' => $redirectTo, 'fragments' => [
'#main-nav' => view('includes.nav')->render()
]]);
} else {
return redirect($redirectTo);
}
}
public function sendFailedLoginResponse(Request $request, $user_not_active = fasle)
{
if ($user_not_active) {
return response()->json(['status' => false, 'email' => 'Your account is not active.']);
}
return response()->json(['status' => false, 'email' => 'Incorrect login credentials.']);
}
в случае, если кто-то пришел сюда в поисках информации о Laravel 5.4 / 5.5, и это позволяет для пользовательского сообщения только для этого сценария (не комбинированное сообщение) вот ответ на это от https://laracasts.com/discuss/channels/laravel/user-account-status
переопределите метод "authenticated" в вашем ' 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,
]);
}
}