关于laravel的Authenticate中间件理解
先来看一下,源代码改忘了,差不多看看
class Authenticate extends Middleware
{
protected function redirectTo($request)
{
return route("/login");
}
}
查看继承的父类得知
<?php
namespace Illuminate\Auth\Middleware;
use Closure;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Contracts\Auth\Factory as Auth;
use Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests;
class Authenticate implements AuthenticatesRequests
{
/**
* The authentication factory instance.
*
* @var \Illuminate\Contracts\Auth\Factory
*/
protected $auth;
/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @return void
*/
public function __construct(Auth $auth)
{
$this->auth = $auth;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string[] ...$guards
* @return mixed
*
* @throws \Illuminate\Auth\AuthenticationException
*/
public function handle($request, Closure $next, ...$guards)
{
$this->authenticate($request, $guards);
return $next($request);
}
/**
* Determine if the user is logged in to any of the given guards.
*
* @param \Illuminate\Http\Request $request
* @param array $guards
* @return void
*
* @throws \Illuminate\Auth\AuthenticationException
*/
protected function authenticate($request, array $guards)
{
if (empty($guards)) {
$guards = [null];
}
foreach ($guards as $guard) {
if ($this->auth->guard($guard)->check()) {
return $this->auth->shouldUse($guard);
}
}
$this->unauthenticated($request, $guards);
}
/**
* Handle an unauthenticated user.
*
* @param \Illuminate\Http\Request $request
* @param array $guards
* @return void
*
* @throws \Illuminate\Auth\AuthenticationException
*/
protected function unauthenticated($request, array $guards)
{
throw new AuthenticationException(
'Unauthenticated.', $guards, $this->redirectTo($request)
);
}
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function redirectTo($request)
{
//
}
}
- redirectTo会被返回
抛出异常会被foundation中的exception的handle的render方法捕获,会再次调用判断accept中是否含有/json +json这两个,如果没有就返回redirectTo的route
// 系统的捕获函数,通过$exception获取directTo返回达到即使Authenticate即使为空也会跳转的效果 protected function unauthenticated($request, AuthenticationException $exception) { return $this->shouldReturnJson($request, $exception) ? response()->json(['message' => $exception->getMessage()], 401) : redirect()->guest($exception->redirectTo() ?? route('login')); }
- 中间件处理方法中,有判断返回是否为response的功能,因此如果要在中间件中返回响应只有在handle中return repsonse,类中其他方法调用return response无效
- 应该可以通过在redirectTo中抛出其他异常达到自定义响应功能,当然异常不能为UnauthorizedException,否则依旧会被捕获
- app/Exceptions 是用来定义错误类型的,对于错误的捕获和响应只能在handler的render函数中操作
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。