Laravel 身份认证

386 阅读1分钟

Laravel身份认证机制解析,这里我把它划分成2中模式分别是网页session模式和Api Token模式

网页session模式

使用FileSessionHandler类实现session会话储存,使用SessionGuard类继承StatefulGuard接口类实现用户登录、退出和记住登录操作。用户登录成功后会生成新的session储存身份标识,若记住登录会用cookie储存身份信息,用于sesssion失效后进行自动登录。

  • Kernal.php配置路由中间件Illuminate\Auth\Middleware\Authenticate,配合路由配置进行身份认证
  • auth.php配置guardsproviders,遍历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.guardmigration、路由、中间件
  • 中间件Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful检查是否为网页请求若是则绑定页面所需中间件
  • 利用Laravel\Sanctum\Guard魔术方法__invoke进行身份认证