基于CAS实现通用的单点登录解决策略(三):客户单点退出完成

原创
小哥 3年前 (2022-11-02) 阅读数 10 #PHP
文章标签 PHPLaravel

原理概述

基于 CAS 单点登录系统的退出由两个主要部分组成:

  • CAS 客户端应用程序退出
  • CAS 服务器退出登录状态

我们在 CAS 客户端应用退出后将页面重定向到服务器退出登录状态,然后通过传递过去的回跳地址跳转回客户端应用退出后跳转页面。当然,此时通过单点登录的其它客户端系统还是处于登录状态的,需要等到对应 Session 到期后,我们可以退出,因为我们使用 CAS 扩展包基于 PHP 自带的 Session 执行登录操作,生成用于存储 Session ID 的 Cookie 它完全是随机的,与指定的用户无关,所以指定的用户前端无法通过后端代码实现。 Cookie 和后端 Session 的清空。

客户端配置

在介绍了一般原则后,无论是单点退出还是单点退出,都是方便的。 CAS 客户端或服务器扩展包已经为我们在底层封装了出口实现逻辑。我们只需要稍微配置和定义出口路线。

首先,让我们看一下客户端配置 testapp 为例,在 .env 中新增 CAS 服务器退出地址和退出后退回客户端地址配置项:

CAS_LOGOUT_URL=https://blog56.test/cas/logout
CAS_LOGOUT_REDIRECT=http://app.test

然后在 routes/web.php 在以下位置配置客户端退出路由:

Route::middleware(cas.auth)->get(/logout, function () {
cas()->logout();
});

这样,它就结束了,具体实现代码就通过了。 cas()->logout() 执行时,将定位对应的基础实现 SubfissionCasCasManager 类的 logout 在这种方法中,有兴趣的学生可以看一看。事实上,这是我们上面介绍的清空当地的退出原则。 Session,实现本地退出,然后根据之前配置的地址重定向到。 CAS 服务器退出地址,并带回退回地址参数。

服务器端配置

服务器不需要任何额外配置,即可退出该路由。 leo108/laravel_cas_server 扩展方案还为我们提供了:

Route::get(logout, SecurityController@logout)->name($p.logout)->middleware($auth);

注:CAS 找到了相关的路径定义代码 vendor/leo108/laravel_cas_server/src/Http/routes.php 文件中。

找到对应的服务器出口实现代码 Leo108CASHttpControllersSecurityController

public function logout(Request $request)
{
$user = $this->loginInteraction->getCurrentUser($request);
if ($user) {
$this->loginInteraction->logout($request);
$this->pgTicketRepository->invalidTicketByUser($user);
event(new CasUserLogoutEvent($request, $user));
}
$service = $request->get(service);
if ($service && $this->serviceRepository->isUrlValid($service)) {
return redirect($service);
}

return $this->loginInteraction->showLoggedOut($request);
}

接下来,我们需要在前面定制服务类。 AppServicesCASUserLogin 一个新的 logout 方法实现:

public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
}

此代码将在上述控制器方法中的此行代码上执行:

$this->loginInteraction->logout($request);

然后,系统将确定它是否得到了代理商的授权。 Ticket 清除对应的数据库记录,完成服务器的退出逻辑,触发系统。 CasUserLogoutEvent 事件,如果在服务器退出时需要执行某些操作,则可以侦听并处理该事件。

接下来,系统退出 URL 中解析 service 字段,存储客户端退回地址,我们检查该地址是否有效(域名是否在 cas_service_hosts 如果它是有效的,它将跳到它。

如果退回地址域名无效,或者如果客户端应用程序未配置退回地址,则通过。 AppServicesCASUserLogin 类中的 showLoggedOut 方法,在该方法中可以重定向到指定的页或直接呈现退出视图。

单点退出演示文稿

介绍完客户端和服务器端配置和退出原理后,我们来简单演示下单点登录退出流程。

打开浏览器并访问 http://app.test 如果您尚未登录,请先登录,然后在浏览器中输入。 http://app.test/logout 退出应用程序,应用程序退出后,会跳转到服务器退出,然后跳回。 http://app.test

如前所述,通过单点登录的其他客户端仍处于登录状态。目前使用的扩展包不能实现统一退出功能。如果有必要,它可以自己实施。您可以传递登录客户端状态。 CAS 服务器端管理,如具体按用户对应。 Session ID,然后通过监听器监听服务器退出事件,一旦退出,立即向所有其他登录的客户端发送通知,让它们销毁对应的 Session ID 可以完成统一退出:

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

上一篇:Layui上传文件编辑 下一篇:Ansible--Module