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'));
}
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 delunauthenticated
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
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));
}
}
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
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
zardox
Simplemente agregue una ruta para iniciar sesión en el archivo de rutas:
Route::get('/login', [
'uses' => 'UserController@getSignin',
'as' => '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