Estoy usando Laravel 5.4 e intento implementar un sistema de autenticación. Utilicé el comando php craft make:auth para configurarlo. Edité las vistas de acuerdo con mi diseño. Ahora, cuando intento cerrar la sesión, me arroja este error
NotFoundHttpException en RouteCollection.php línea 161:
¿alguien podría ayudarme a cerrar la sesión?
Tauro
En tus web.php
(rutas):
agregar:
Route::get('logout', '\App\Http\Controllers\Auth\LoginController@logout');
En tus LoginController.php
agregar:
public function logout(Request $request) {
Auth::logout();
return redirect('/login');
}
Además, en la parte superior de LoginController.php
después namespace
agregar:
use Auth;
Ahora, puede cerrar la sesión usando yourdomain.com/logout
URL o si ha creado logout button
agregue href a /logout
-
¿Por qué no usar laravel preconstruido?
auth routes
?– Sid
3 sep 2017 a las 10:36
-
Descubrí que esto ya no es suficiente, también debe agregar
$request->session()->invalidate();
a la función de cierre de sesión: esto evita algunos escenarios extraños que encontré.– Dan
1 de septiembre de 2018 a las 1:46
-
¡Funciona! Pero la respuesta de @Sid a continuación es la mejor (y más rápida) opción
– gtamborero
19 de septiembre de 2018 a las 8:27
-
Request $request
hacer nada aquí.– Eranda
11 de octubre de 2018 a las 9:28
-
¡Esta es la mejor respuesta en este tema! He intentado otras 5 formas diferentes de hacer esto y he fallado cada vez. ¡¡¡Esto funciona perfectamente!!!
– Gediminas
16 de septiembre de 2019 a las 13:18
sid
Bueno, incluso si lo que sugiere @Tauras simplemente funciona, no creo que sea la forma correcta de lidiar con esto.
Dijiste que has corrido php artisan make:auth
que también debería haber insertado Auth::routes();
en tus routes/web.php
archivos de enrutamiento. Que viene por defecto logout
ruta ya definida y tiene nombre logout
.
Puedes verlo aquí en GitHubpero también informaré el código aquí por simplicidad:
/**
* Register the typical authentication routes for an application.
*
* @return void
*/
public function auth()
{
// Authentication Routes...
$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
$this->post('login', 'Auth\LoginController@login');
$this->post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
$this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
$this->post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');
}
Por otra parte, tenga en cuenta que logout
requiere POST
como método de solicitud HTTP. Hay muchas razones válidas detrás de esto, pero solo por mencionar una muy importante es que de esta manera puedes prevenir falsificación de solicitud entre sitios.
Entonces, de acuerdo con lo que acabo de señalar, una forma correcta de implementar esto podría ser solo esta:
<a href="https://stackoverflow.com/questions/43585416/{{ route("logout') }}" onclick="event.preventDefault(); document.getElementById('frm-logout').submit();">
Logout
</a>
<form id="frm-logout" action="https://stackoverflow.com/questions/43585416/{{ route("logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
Finalmente, tenga en cuenta que he insertado laravel fuera de la función lista para usar {{ csrf_field() }}
!
-
el uso del campo de evento está en desuso; ¿Con qué reemplazar?
– Hossey NJF
3 de agosto de 2019 a las 7:38
-
¿Cómo cerraría la sesión usando solo una etiqueta de anclaje cuando no hay ningún formulario involucrado?
– Roberto Rocha
24/09/2021 a las 19:23
Puede usar lo siguiente en su controlador:
return redirect('login')->with(Auth::logout());
-
Esta debería ser una respuesta aceptada. ¡Funciona de maravilla!
– willbeeler
28 de agosto de 2018 a las 19:31
-
Esto no tiene sentido.
with()
es para enviar datos a la sesión y toma una cadena o matriz. ¿Por qué pondríasAuth::logout()
¿allá? Ni siquiera devuelve nada, ya que su tipo de retorno es nulo.– halloei
28 de abril de 2021 a las 16:17
-
Esto todavía funciona con Laravel> 8 como encanto
– Zurdo
31 de mayo a las 10:15
La mejor manera para Laravel 5.8
100% trabajado
Agregue esta función dentro de su Autenticación\LoginController.php
use Illuminate\Http\Request;
Y también agrega esto
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
return $this->loggedOut($request) ?: redirect('/login');
}
aquí hay otra forma de hacerlo llamando a Auth::logout() en la ruta
Route::get('/logout', function(){
Auth::logout();
return Redirect::to('login');
});
jonathan rey
Te recomiendo que te quedes con las rutas de autenticación de Laravel en web.php: Auth::routes()
Creará la siguiente ruta:
POST | logout | App\Http\Controllers\Auth\LoginController@logout
Deberá cerrar la sesión mediante un formulario POST. De esta manera, también necesitará el token CSRF que se recomienda.
<form method="POST" action="https://stackoverflow.com/questions/43585416/{{ route("logout') }}">
@csrf
<button type="submit">Logout</button>
</form>
Ghanshyam Nakiya
En Laravel 6.2
Agregue la siguiente ruta a: web.php
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
Uso de la etiqueta Achor con cierre de sesión mediante un formulario POST. De esta manera, también necesitará el token CSRF.
<a class="log-out-btn" href="#" onclick="event.preventDefault();document.getElementById('logout-form').submit();"> Logout </a>
<form id="logout-form" action="https://stackoverflow.com/questions/43585416/{{ route("logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
-
esta es la forma correcta de hacerlo.
– Natnael Ghirma
16 de junio de 2021 a las 13:01
¿Envía tu código a?
– Mayank Pandeyz
24 de abril de 2017 a las 10:21