Laravel 5.5 cambia la URL de redireccionamiento de inicio de sesión no autenticado

7 minutos de lectura

En Laravel < 5.5 Podría cambiar este archivo app/Exceptions/Handler para cambiar la URL de redireccionamiento del usuario no autenticado:

protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    return redirect()->guest(route('login'));
}

Pero en Laravel 5.5 esto ha sido movido a esta ubicación vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php Entonces, ¿cómo puedo cambiarlo ahora? No quiero cambiar cosas en el directorio de proveedores en caso de que las actualizaciones del compositor lo anulen.

protected function unauthenticated($request, AuthenticationException $exception)
{
    return $request->expectsJson()
                ? response()->json(['message' => 'Unauthenticated.'], 401)
                : redirect()->guest(route('login'));
}

  • laravel-news.com/custom-exception-informes encontré esto

    – Félix

    27 de julio de 2017 a las 3:43

  • Por lo tanto, puede detectar el error de autenticación y luego redirigir antes de que laravels lo detecte. Genial gracias

    – robo

    27 de julio de 2017 a las 4:57

  • @robertmylne ¿está funcionando? ¡porque esta solución es solo para informar!

    – Maraboc

    27 de julio de 2017 a las 7:48

  • @Maraboc realmente no está haciendo lo que esperaba que hiciera. Realmente esperaba que hubiera un lugar para anularlo.

    – robo

    28 de julio de 2017 a las 1:44

avatar de usuario
Seb. Kra.

Pero en Laravel 5.5 esto se ha movido a esta ubicación proveedor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php entonces, ¿cómo puedo cambiarlo ahora? No quiero cambiar cosas en el directorio de proveedores en caso de que las actualizaciones del compositor lo anulen.

Es solo que la función ya no está allí por defecto.

Simplemente puede anularlo como lo hizo en 5.4. Solo asegúrate de incluir

use Exception;
use Request;
use Illuminate\Auth\AuthenticationException;
use Response;

en el archivo del controlador.

por ejemplo mi app/Exceptions/Handler.php se parece un poco a esto:

<?php
    namespace App\Exceptions;
    use Exception;
    use Request;
    use Illuminate\Auth\AuthenticationException;
    use Response;
    use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
    class Handler extends ExceptionHandler
    {
        (...) // The dfault file content
        /**
         * Convert an authentication exception into a response.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Illuminate\Auth\AuthenticationException  $exception
         * @return \Illuminate\Http\Response
         */
         protected function unauthenticated($request, AuthenticationException $exception)
         {
            return $request->expectsJson()
                    ? response()->json(['message' => 'Unauthenticated.'], 401)
                    : redirect()->guest(route('authentication.index'));
    }
}

  • La mejor respuesta que he encontrado, gracias! Solo una cosa: ¿hay alguna forma en lugar de usar expectsJson(), verificando si la solicitud fue a través de la ruta api?

    – Dave Nottage

    2 de noviembre de 2017 a las 22:53

  • son hombres increíbles, estaba pensando en deshabilitar el middleware web, pero esta solución es la mejor.

    – Andrés Felipe

    12 de enero de 2018 a las 13:07

  • if (in_array('api', \Route::getCurrentRoute()->computedMiddleware)) { return response()->json(['error' => 'Unauthenticated.'], 401); }

    – dolor

    27 de enero de 2018 a las 20:18


  • La función no autenticada en kernal.php no está presente en la versión 5.7.

    – UJ India

    15 de noviembre de 2018 a las 13:01


  • muchas gracias, pero tuve que intercambiar la respuesta de línea y redirigir entre sí, ya que tengo una API, en la que tengo un método de cierre de sesión, así que en cartero cuando cerré la sesión del usuario después de completar el valor del encabezado como autorización = portador más token de acceso generado por el inicio de sesión, en el primer golpe cerró la sesión del usuario, pero si hice clic nuevamente, dice que no hay mensaje, y ahora ha sido reemplazado por el mensaje json: no autenticado

    – shashi verma

    20 de noviembre de 2018 a las 5:14

Así es como lo resolví. En la función de procesamiento, atrapé la clase de excepción. Y en caso de que se trate de una clase de excepción de autenticación, escribí mi código para redirigir (el código que escribiría en una función no autenticada en la versión anterior).

public function render($request, Exception $exception)
{
    $class = get_class($exception);

    switch($class) {
        case 'Illuminate\Auth\AuthenticationException':
            $guard = array_get($exception->guards(), 0);
            switch ($guard) {
                case 'admin':
                    $login = 'admin.login';
                    break;
                default:
                    $login = 'login';
                    break;
            }

            return redirect()->route($login);
    }

    return parent::render($request, $exception);
}

  • gracias me funciono Utilicé el tutorial de DevMarketer MultiAuth en youtube pero parece que no funciona en laravel 5.5. esto resuelve mi problema.

    – Winnie Damayo

    10 de septiembre de 2017 a las 7:02

  • trabajó conmigo 2, y estoy demandando a devMarketer… el mundo es demasiado pequeño

    – Kareem Nour Emam

    11 de noviembre de 2017 a las 0:31

  • Trabajando en este mismo tema. Cuando consiguió que esto funcionara, ¿usó la función estándar de Laravel 5.5 para unauthenticated? ¿O también incluiste la versión del unauthenticated función de 5.4?

    – cmpreshn

    4 de julio de 2018 a las 1:44

  • He probado este código, pero $exception->guards() siempre no me devuelve nada, así que no tengo nada contra lo que probar. Si tiene algún recurso adicional que pueda recomendar para una solución, se lo agradecería. Gracias por tu respuesta.

    – cmpreshn

    4 de julio de 2018 a las 1:55

  • todavía me da esto Route [login] not defined.

    – Devops-Paddy

    27 de junio de 2019 a las 9:16

Pero en Laravel 5.5 esto se ha movido a esta ubicación proveedor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php entonces, ¿cómo puedo cambiarlo ahora? No quiero cambiar cosas en el directorio de proveedores en caso de que las actualizaciones del compositor lo anulen.

Solo necesitamos incluir el uso Illuminate\Auth\AuthenticationException;

y luego funciona como en laravel 5.4

  • Gracias, esta solución funciona para mí en Laravel 5.5 🙂

    –Tommy Tom

    9 de noviembre de 2017 a las 2:23

avatar de usuario
harón

Para Laravel (5.4, 6, 7, 8.x)

No quiero cambiar en el directorio de proveedores en caso de que sea anulado por las actualizaciones del compositor. Simplemente puede anularlo como lo hizo en 5.4. Solo asegúrate de incluir.

Archivo: Aplicación\Excepciones\Handler.php

Copia esto a continuación code y pasado a tu app\Exception\Handler

<?php

namespace App\Exceptions;

use Request;
use Illuminate\Auth\AuthenticationException;
use Response;

use Illuminate\Support\Arr;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  \Throwable  $exception
     * @return void
     *
     * @throws \Exception
     */
    public function report(Throwable $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Throwable  $exception
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @throws \Throwable
     */
    public function render($request, Throwable $exception)
    {
        return parent::render($request, $exception);
    }
        protected function unauthenticated($request, AuthenticationException $exception)
    {
        // return $request->expectsJson()
        //             ? response()->json(['message' => $exception->getMessage()], 401)
        //             : redirect()->guest(route('login'));

        if($request->expectsJson()) {
            return response()->json(['message' =>  $exception->getMessage()],401);
        }

        $guard = Arr::get($exception->guards(), 0);

        switch ($guard) {
            case 'admin':
            $login = 'admin.login';
            break;
            case 'vendor':
            $login = 'vendor.login';
            break;
            
            default:
            $login = 'login';
            break;
        }

        return redirect()->guest(route($login));

    }
}

avatar de usuario
psc

El controlador de excepciones estándar utiliza una ruta con nombre.

Entonces, solo define su ruta para usar ese nombre.

Entonces, en tu routes/web.php archivo, simplemente agregue la línea:

Route::get('mylogin', 'MyLoginController@showLoginForm')->name('login');

los name('login') bit le da un nombre a esta ruta, por lo que la excepción no autenticada usará esta ruta.

No necesita molestarse en crear su propio controlador de excepciones o modificar el controlador de excepciones estándar.

Las rutas nombradas utilizadas por el código estándar de ‘autorización’ se pueden encontrar en el vendor/laravel/framework/src/Illuminate/Routing/Router.php archivo, en el auth() función. (iniciar sesión, cerrar sesión, registrarse, contraseña.solicitud, contraseña.email y contraseña.restablecer). Estas rutas se agregan cuando utiliza el Route::auth(); línea en el archivo de ruta.

  • Gracias por una solución simple al problema, no sé por qué nadie más votó esto, esto resolvió el problema para mí, y las respuestas complejas en realidad ni siquiera funcionaron.

    –Ashley Kleynhans

    26 de junio de 2018 a las 20:57

  • Esto me ayudó mucho

    – kellymandem

    26 de septiembre de 2018 a las 8:27

avatar de usuario
Hesam Moosapour

En las versiones más nuevas de Laravel, debe ir a

aplicación/Http/Middleware/Authenticate.php

Ahora puedes editar la función y redirigirla a donde quieras:

protected function redirectTo($request)
{
    if (! $request->expectsJson()) {
        return route('login');
    }
}

Espero eso ayude.

  • Gracias por una solución simple al problema, no sé por qué nadie más votó esto, esto resolvió el problema para mí, y las respuestas complejas en realidad ni siquiera funcionaron.

    –Ashley Kleynhans

    26 de junio de 2018 a las 20:57

  • Esto me ayudó mucho

    – kellymandem

    26 de septiembre de 2018 a las 8:27

avatar de usuario
zardox

Simplemente agregue una ruta para iniciar sesión en el archivo de rutas:

Route::get('/login', [
   'uses' => 'UserController@getSignin',
   'as' => 'login'
]);

¿Ha sido útil esta solución?