Laravel 4 Auth :: попытка использовать либо электронную почту, либо имя пользователя и пароль

В laravel для попытки входа в систему я обычно использую что-то вроде этого:

if (Auth::attempt(array('email' => $usernameinput, 'password' => $password), true)) { // The user is being remembered... } 

В основном $usernameinput будет проверяться с помощью email из моей таблицы.

Я думал сделать это по-другому, например, в моей таблице есть email , username и password . $usernameinput может быть как по email и по username в моей таблице.

Как я могу Auth::attempt с условием типа:

 (email==$usernameinput OR username==$usernameinput) AND password == $password 

Ну, вы можете просто проверить, соответствует ли $usernameinput шаблону электронной почты, и если да, используйте поле email , иначе используйте поле username . Это звучит разумно, потому что, действительно, у вас действительно не должно быть электронной почты в вашей базе данных, которая не соответствует шаблону. Что-то вроде этого:

 $field = filter_var($usernameinput, FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; if (Auth::attempt(array($field => $usernameinput, 'password' => $password), true)) { // ... } 

Другой вариант заключается в том, чтобы расширить Illuminate\Auth\Guard добавив требуемую функциональность и установив ее как компонент auth в новом поставщике услуг.

Это можно сделать примерно так

 $ field = Validator :: make (array ('email' => $ usernameinput, array ('email' => 'email')) -> pass ()? 'email': 'username';
 if (Auth :: попытка (массив ($ field => $ usernameinput, 'password' => $ password), true)) {
     return Redirect :: предназначенный ('профиль');
 }

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

 if (Auth::attempt(array( 'email' => Input::get('email_or_username'), 'password' => Input::get('password') )) || Auth::attempt(array( 'username' => Input::get('email_or_username'), 'password' => Input::get('password') ))) { // SUCCESS } else { // FAILURE } 

Вот полное рабочее решение: (Протестировано с Laravel 5.3)

Просто добавьте этот метод (или мы можем сказать переопределить) в app \ Http \ Controllers \ Auth \ LoginController.php

 public function login(Request $request) { $usernameinput = $request->input('email'); $password = $request->input('password'); $field = filter_var($usernameinput, FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; if (Auth::attempt([$field => $usernameinput, 'password' => $password])) { return redirect()->intended('/'); } else { return $this->sendFailedLoginResponse($request); } }