Laravel身份认证机制解析,这里我把它划分成2中模式分别是网页session模式和Api Token模式
网页session模式
使用FileSessionHandler类实现session会话储存,使用SessionGuard类继承StatefulGuard接口类实现用户登录、退出和记住登录操作。用户登录成功后会生成新的session储存身份标识,若记住登录会用cookie储存身份信息,用于sesssion失效后进行自动登录。
Kernal.php配置路由中间件Illuminate\Auth\Middleware\Authenticate,配合路由配置进行身份认证auth.php配置guards和providers,遍历guards执行check方法进行身份检查- 为了安全起见一般会开启
Illuminate\Cookie\Middleware\EncryptCookies中间件对cookie进行加密 - 用户模型需继承
Illuminate\Foundation\Auth\User类来配合身份认证
Illuminate\Auth\SessionGuard
// 储存记住登录cookie数据
protected function queueRecallerCookie(AuthenticatableContract $user)
{
$this->getCookieJar()->queue($this->createRecaller(
$user->getAuthIdentifier().'|'.$user->getRememberToken().'|'.$user->getAuthPassword()
));
}
// 生成记住登录cookie键
public function getRecallerName()
{
return 'remember_'.$this->name.'_'.sha1(static::class);
}
// 检查用户身份,返回用户模型
public function user()
{
...
$id = $this->session->get($this->getName());
// session认证
if (! is_null($id) && $this->user = $this->provider->retrieveById($id)) {
$this->fireAuthenticatedEvent($this->user);
}
// session失效,若开启记住登录,写入身份标识到session中
if (is_null($this->user) && ! is_null($recaller = $this->recaller())) {
$this->user = $this->userFromRecaller($recaller);
if ($this->user) {
$this->updateSession($this->user->getAuthIdentifier());
$this->fireLoginEvent($this->user, true);
}
}
return $this->user;
}
API Tokens模式
利用轻量级Sanctum扩展支持单用户多token支持,支持请求头Authorization身份验证
- 该模式支持多个单页面应用、手机APP进行身份认证
- 服务注册类
Laravel\Sanctum\SanctumServiceProvider配置auth.guard、migration、路由、中间件 - 中间件
Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful检查是否为网页请求若是则绑定页面所需中间件 - 利用
Laravel\Sanctum\Guard魔术方法__invoke进行身份认证