php - usuario - Laravel 5.5 cambia la URL de redireccionamiento de inicio de sesión no autenticado
usuario administrador laravel (8)
En Laravel < 5.5
podría cambiar esta app/Exceptions/Handler
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 se ha movido a este vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
ubicación vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
¿cómo puedo cambiarlo ahora? No quiero cambiar las cosas en la caja del directorio del proveedor, las actualizaciones del compositor las anulan.
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson()
? response()->json([''message'' => ''Unauthenticated.''], 401)
: redirect()->guest(route(''login''));
}
Pero en Laravel 5.5 esto se ha movido a este proveedor de ubicación / laravel / framework / src / Illuminate / Foundation / Exceptions / Handler.php, ¿cómo puedo cambiarlo ahora? No quiero cambiar las cosas en la caja del directorio del proveedor, las actualizaciones del compositor las anulan.
Es solo el caso de que la función ya no está allí por defecto.
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 Handler.
Por ejemplo, mi app/Exceptions/Handler.php
ve algo así:
<?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''));
}
}
Pero en Laravel 5.5 esto se ha movido a este proveedor de ubicación / laravel / framework / src / Illuminate / Foundation / Exceptions / Handler.php, ¿cómo puedo cambiarlo ahora? No quiero cambiar las cosas en la caja del directorio del proveedor, las actualizaciones del compositor las anulan.
Solo tenemos que incluir el uso Illuminate / Auth / AuthenticationException;
y luego funciona como en laravel 5.4
1. Vaya al archivo vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
.
2.Buscar el nombre del método unauthenticated
está unauthenticated
.
3.Y cambie la url de redirect()->guest(route(''login''))
de redirect()->guest(route(''login''))
para redirect()->guest(route(''api/login'')) //whatever you want
.
Podría devolver la respuesta como JSON si se trata de servicios API.
Además de overriding
, puede realizar cambios directamente en Handler.php
a la función existente no autenticada ubicada en el vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
para redirigir a la ruta deseada según los guardias.
/**
* 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)
{
$guard = array_get($exception->guards(),0);
switch ($guard) {
case ''admin'':
return $request->expectsJson()
? response()->json([''message'' => $exception->getMessage()], 401)
: redirect()->guest(route(''admin.login''));
break;
default:
return $request->expectsJson()
? response()->json([''message'' => $exception->getMessage()], 401)
: redirect()->guest(route(''login''));
break;
}
}
Así es como lo resolví. En la función de renderización cogí la clase de excepción. Y en caso de que sea la clase de excepción de autenticación, escribí mi código para redirigirlo (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);
}
El controlador de excepciones estándar utiliza una ruta con nombre.
Entonces, solo define su ruta para usar ese nombre.
Entonces, en su archivo routes/web.php
, solo agregue la línea:
Route::get(''mylogin'', ''MyLoginController@showLoginForm'')->name(''login'');
El bit de name(''login'')
le da a esta ruta un nombre, por lo que la excepción no autenticada usará esta ruta.
No es necesario molestarse en hacer su propio controlador de excepciones o modificar el controlador de excepciones estándar.
Las rutas nombradas utilizadas por el código ''auth'' de la vendor/laravel/framework/src/Illuminate/Routing/Router.php
se pueden encontrar en el vendor/laravel/framework/src/Illuminate/Routing/Router.php
, en la función auth()
. (inicio de sesión, cierre de sesión, registro, password.request, password.email y password.reset). Estas rutas se agregan cuando usa Route::auth();
línea en el archivo de ruta.
Reemplace su aplicación / Excepciones / Handler.php código con el siguiente ...
<?php
namespace App/Exceptions;
use Exception;
use Illuminate/Auth/AuthenticationException;
use Illuminate/Foundation/Exceptions/Handler as ExceptionHandler;
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.`enter code here`
*
* @param /Exception $exception
* @return void
*/
public function report(Exception $exception)
{
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @param /Illuminate/Http/Request $request
* @param /Exception $exception
* @return /Illuminate/Http/Response
*/
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json([''message'' => $exception->getMessage()], 401);
}
$guard = array_get($exception->guards(),0);
switch ($guard) {
case ''admin'':
$login = ''admin.login'';
break;
default:
$login = ''login'';
break;
}
return redirect()->guest(route($login));
}
}
Solo agrega una ruta para iniciar sesión en el archivo de rutas:
Route::get(''/login'', [
''uses'' => ''UserController@getSignin'',
''as'' => ''login''
]);