Laravel 4 Auth :: bash mediante el uso de correo electrónico o nombre de usuario y contraseña

En laravel para el bash de inicio de sesión generalmente utilizo algo como esto:

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

Básicamente, $usernameinput verificará con el email de mi mesa.

Estaba pensando en hacerlo de otra manera, como si hubiera un email , un username y una password en mi mesa. $usernameinput puede ser un campo de email o username en mi tabla.

¿Cómo puedo Auth::attempt con una condición como:

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

Bueno, simplemente podría verificar si $usernameinput coincide con un patrón de correo electrónico y, si lo hace, use el campo de email ; de lo contrario, use el campo de username . Esto suena razonable porque, bueno, realmente no debería haber ningún correo electrónico en su base de datos que no coincida con el patrón. Algo como esto:

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

La otra opción es extender Illuminate\Auth\Guard agregando la funcionalidad deseada y configurándola como el componente de auth en un nuevo proveedor de servicios.

Se puede hacer algo como esto

 $ field = Validator :: make (array ('email' => $ usernameinput, array ('email' => 'email')) -> passes ()? 'email': 'username';
 if (Auth :: attempt (array ($ field => $ usernameinput, 'password' => $ password), true)) {
     return Redirect :: intended ('perfil');
 }

Los usuarios pueden usar un campo de correo electrónico como su nombre de usuario, y es posible que no coincida con el correo electrónico que usaron para el campo de correo electrónico. Más seguro para intentar la autenticación dos veces:

 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 } 

Aquí está la solución de trabajo completa: (Probado con Laravel 5.3)

Simplemente agregue este método (o podemos decir anular) en la aplicación \ 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); } }