sesiones register personalizado example auth php laravel laravel-5 login account

php - personalizado - register laravel



Inicia sesión solo si el usuario está activo usando Laravel (9)

Laravel 5.4 / 5.5

Anule la función de login() predeterminada colocando esta función en su 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); }

Anular el método de login() de esta manera se recomienda sobre muchas de las otras respuestas a esta pregunta porque le permite seguir utilizando muchas de las funciones de autenticación más avanzadas de Laravel 5.4+, como la limitación de inicio de sesión, los controladores / proveedores de protección de autenticación múltiple etc. mientras te permite configurar un mensaje de error personalizado.

Laravel 5.3

Cambie o anule su función postLogin() en su AuthController para tener este aspecto:

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(), ]); }

Este código redirige de nuevo a la página de inicio de sesión con un mensaje de error acerca de que el usuario está inactivo. Si desea redireccionar a una página de autenticación, cambiaría la línea que marcé con el comentario. Change this to redirect elsewhere .

Actualmente estoy trabajando en mi aplicación Laravel y, para evitar el spam, decidí que solo los usuarios activos pueden iniciar sesión. Actualmente estoy usando el sistema de inicio de sesión de Laravel como en el tutorial oficial del sitio web de Laravel, aquí está mi acción de formulario:

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

Esto funciona completamente bien, sin embargo, me gustaría verificar si el usuario está activo, si no está activo, se lo redireccionará a la página de activación, de lo contrario se registraría. ¿Hay una forma sencilla de hacerlo o estoy obligado a hacer un nuevo controlador, rutas y más verificaciones? Gracias.

Editar: Olvidé mencionar que tengo una columna ''activa'' en mi base de datos.


Compruebo que el usuario está activado al sobrescribir la función sendLoginResponse en 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()); }


En Laravel 5.4 abrir Auth / LoginController.php

y añadir esta función:

/** * 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]; }

Y ya terminaste ..!


En caso de que alguien venga aquí buscando información sobre Laravel 5.4 / 5.5, y que permita un mensaje personalizado solo para este escenario (no un mensaje combinado), aquí está la respuesta para eso en https://laracasts.com/discuss/channels/laravel/user-account-status

Reemplace el método ''autenticado'' dentro de su archivo ''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, ]); } }


Esta solución se basa en la idea de Can Celik y se probó con Laravel 5.3.

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

Los dos últimos parámetros separados por comas ( active,1 ) actúan como una cláusula WHERE active = ''1'' ( WHERE active = ''1'' ) y pueden escribirse de esta manera:

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

Normalmente, el método de validación solo verifica si se completan los campos de correo electrónico y contraseña. Con la modificación anterior, requerimos que una dirección de correo electrónico determinada se encuentre en una fila de base de datos con active valor active establecido en 1.

ACTUALIZACIÓN (probado con Laravel 5.5):

También puedes personalizar el mensaje:

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.'' ]); }

Tenga en cuenta que el mensaje anterior se mostrará cuando no exista una dirección de correo electrónico determinada o cuando la cuenta esté deshabilitada.


Gracias @Can_Celik

así fue como pude resolver mi problema porque estaba usando la json response con jquery.

/** * Validate the user login request. * * @param /Illuminate/Http/Request $request * @return void */ protected function validateLogin(Request $request) { $this->validate($request, [ ''email'' => ''required|email|exists:users_table,email,account_status_colunm,active_value'', ''password'' => ''required'', ]); }

luego, en el archivo validation.php , agregue esto a sus cadenas de validación personalizadas

... ''email'' => [ ''exists'' => ''Account has been disabled. Contact our team.'' ],

eso es todo ... funciona bien ...


No tienes que anular toda la función. Simplemente puede cambiar el Validador en AuthController para lograr que agregue la validación "existe: tabla, columna".

Supongamos que tiene una tabla de usuarios con correo electrónico, contraseña y campos activos.

''email'' => ''exists:users,email,active,1''

Aquí está la función validotor que debería verse en AuthController.php

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

o si está utilizando borrados suaves, esto debería funcionar también.

''email'' => ''exists:users,email,deleted_at,NULL''

También puede consultar la regla de validación en este enlace http://laravel.com/docs/5.1/validation#rule-exists


Si alguien usa una solicitud de ajax al iniciar sesión y quiere tener un mensaje personalizado, así es como logré esto en el controlador de inicio de sesión :

función de inicio de sesión ()

// 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); } }

Y otras funciones

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.'']); }


en el método de reemplazo de AuthController getCredentials como este:

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

asegúrate de tener la columna activa en la tabla de usuarios ...