[英]Laravel 5.5 change unauthenticated login redirect url
在Laravel < 5.5
,我可以更改此文件app/Exceptions/Handler
以更改未经身份验证的用户重定向 url:
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
return redirect()->guest(route('login'));
}
但在Laravel 5.5
中,它已移至此位置vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
那么我现在如何更改它? 我不想更改供应商目录中的内容,以免它被作曲家更新覆盖。
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson()
? response()->json(['message' => 'Unauthenticated.'], 401)
: redirect()->guest(route('login'));
}
但是在 Laravel 5.5 中,这已经移动到这个位置 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php 那么我现在如何更改它? 我不想更改供应商目录中的内容,以防它被作曲家更新覆盖。
只是默认情况下该功能不再存在。
您可以像在 5.4 中那样覆盖它。 只要确保包括
use Exception;
use Request;
use Illuminate\Auth\AuthenticationException;
use Response;
在处理程序文件中。
例如我的app/Exceptions/Handler.php
看起来有点像这样:
<?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'));
}
}
这是我解决它的方法。 在渲染函数中,我捕获了异常类。 如果它是身份验证异常类,我编写了重定向代码(我将在以前版本的未经身份验证的函数中编写的代码)。
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);
}
但是在 Laravel 5.5 中,这已经移动到这个位置 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php 那么我现在如何更改它? 我不想更改供应商目录中的内容,以防它被作曲家更新覆盖。
我们只需要包含 use Illuminate\\Auth\\AuthenticationException;
然后它就像在laravel 5.4中一样工作
对于 Laravel ( 5.4, 6, 7, 8.x )
我不想在供应商目录中进行更改,以防它被 composer updates 覆盖。 您可以像在 5.4 中那样覆盖它。 只要确保包括。
文件:App\\Exceptions\\Handler.php
将此下面的code
复制并粘贴到您的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));
}
}
标准异常处理程序使用命名路由。
因此,您只需定义您的路线以使用该名称。
因此,在您的routes/web.php
文件中,只需添加以下行:
Route::get('mylogin', 'MyLoginController@showLoginForm')->name('login');
name('login')
位为该路由命名,因此未经name('login')
验证的异常将使用该路由。
您无需费心制作自己的异常处理程序或修改标准异常处理程序。
样板“auth”代码使用的命名路由可以在vendor/laravel/framework/src/Illuminate/Routing/Router.php
文件的auth()
函数中找到。 (登录、注销、注册、password.request、password.email 和 password.reset)。 当您使用Route::auth();
时会添加这些路由Route::auth();
路由文件中的一行。
在 Laravel 的较新版本中,您应该 go 到
应用程序/Http/Middleware/Authenticate.php
现在您可以编辑 function 并将其重定向到您想要的任何位置:
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
return route('login');
}
}
希望能帮助到你。
只需在路由文件中添加一个用于登录的路由:
Route::get('/login', [
'uses' => 'UserController@getSignin',
'as' => 'login'
]);
将您的 app\\Exceptions\\Handler.php 代码替换为以下内容....
<?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));
}
}
Copy this to your app\\Exception\\Handler
use Request;
use Illuminate\Auth\AuthenticationException;
use Response;
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':
return redirect()->guest(route('admin.login'));
break;
default:
return redirect()->guest(route('login'));
break;
}
}
对于 Laravel 7.x+
===========**top add class:**================
use Illuminate\Auth\AuthenticationException;
use Illuminate\Support\Arr;
=======================================
public function render($request, Throwable $exception)
{
if($exception instanceof AuthenticationException){
$guard = Arr::get($exception->guards(), 0);
switch($guard){
case 'admin':
return redirect(route('admin.login'));
break;
default:
return redirect(route('login'));
break;
}
}
return parent::render($request, $exception);
}
对于 Laravel 版本 7.*
文件:App\\Exceptions\\Handler.php
使用 Illuminate\\Support\\Arr; //顶级
使用 Illuminate\\Foundation\\Exceptions\\Handler 作为 ExceptionHandler;
公共函数渲染($request,Throwable $exception){
// for Multi AUth guard
if($exception instanceof AuthenticationException){
$guard = Arr::get($exception->guards(), 0);
switch($guard){
case 'admin':
return redirect(route('admin.login'));
break;
default:
return redirect(route('login'));
break;
}
}
return parent::render($request, $exception);
}
除了overriding
,你可以直接作出变更Handler.php
现有功能未认证的位于vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
重定向到基于后卫的去向。
/**
* 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;
}
}
1.转到vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
文件。
2.搜索方法名称unauthenticated
。
3.并将重定向 url 从redirect()->guest(route('login'))
更改为redirect()->guest(route('api/login')) //whatever you want
。
如果它是 API 服务,您可以将响应作为 JSON 返回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.