¿Cómo cerrar sesión y redirigir a la página de inicio de sesión usando Laravel 5.4?

5 minutos de lectura

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?

  • ¿Envía tu código a?

    – Mayank Pandeyz

    24 de abril de 2017 a las 10:21

avatar de usuario
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.phpdespués namespace

agregar:

use Auth;

Ahora, puede cerrar la sesión usando yourdomain.com/logout URL o si ha creado logout buttonagregue 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

avatar de usuario
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ías Auth::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');
});

avatar de usuario
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>

avatar de usuario
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

¿Ha sido útil esta solución?