SpringBoot应用如何以优雅的方式对接老旧SSO实现单点登录逻辑

Posted 太空眼睛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot应用如何以优雅的方式对接老旧SSO实现单点登录逻辑相关的知识,希望对你有一定的参考价值。

目录

背景介绍

我们现在开发WEB应用最流行的框架就是SpringBoot,开发好的应用程序经常要接入企业内部的SSO系统,因为现在企业里面基本上都有自己的一套统一认证服务,企业开发的各个业务系统都对接这个统一认证服务,那么就可以实现企业内部的单点登录了。

统一认证服务经常也叫做SSO,有些SSO是很久以前开发的比较老旧,接入的方式可能也是利用浏览器的SessionCookie来实现。但是现在流行前后端分离,并且随着JWT的发展,前后端的交互更多喜欢采用JWT方式进行认证,JWT更加灵活,所以很受欢迎。

那么,有没有办法在对接老旧的基于SessionCookie方式的单点登录时,可以以更优雅的方式采用JWT方式进行实现呢?答案是肯定的。

本文前端使用front表示,后端使用back表示,统一认证服务使用sso表示。

设计思想

登录前的时序图

front back sso 前端发起一个请求(不带JWT) 自定义请求头URL_REFER:当前页面 https://back/helo-world back获取当前会话的coSessionId request.getSession(true).getId() back通过coSessionId获取用户信息 getSsoUser() 返回null 响应标准302,请求头Location sendRedirect(“https://sso/login.jsp”) 前端根据302重定向到Location地址 location.href="https://sso/login.jsp" 输入登录账号、密码进行登录 login() 登录成功回调back https://back/surl?ssoSessionId=xxx 通过coSessionId获取用户信息 getSsoUser(coSessionId) 返回SsoUser 生成JWT createJWT(coSessionId, ssoSessionId) 响应302,重定向到用户跳转登录前的页面 自定义请求头ACCESS_TOKEN: JWT sendRedirect(URL_REFER) location.href=URL_REFER front back sso

登录后的时序图

front back sso 请求头Authentication: JWT https://back/hello-world 校验JWT,得到coSessionId和ssoSessionId validateJwt() 通过coSessionId获取用户信息 getSsoUser(coSessionId) 返回SsoUser 执行hello-world业务逻辑 helloWorld() 200 "result": "hello,world" front back sso

back内部认证逻辑的设计

身份认证主要由2个Filter完成,一个处理登录逻辑的LoginFilter,一个处理JWT校验的JwtFilter,接下来分别讲讲两个Filter的内部流程设计

LoginFilter内部流程

sso 参考技术A

SpringBoot最大特点便是简化配置,提升开发效率,实现简单部署就是通过内嵌一个Web容器,如果Tomcat、Jettty等。
对于SpringBoot应用,只需打包成一个简单的Jar包,然后执行java -jar就可以启动,是一种非常优雅的方式,但同时也隐藏着一些问题,如:应用如何停止?对于传统的部署在容器中的Java应用(非Spring Boot应用)可以使用容器提供的脚本优雅重启,但是SpringBoot应用容器是内嵌的,也就不会存在容器的脚本,最直接的想法就是kill进程,但这样很不优雅,进程强行终止会带来数据丢失或者终端无法恢复到正常的状态,在分布式环境下还可能导致数据不一致的情况。

SpringBoot提供了几种停止的方法,本文重点介绍actuator endpoint的方法,SpringBoot官方文档的Endpoints章节中介绍了应用发布生产准备的各种特性,其中通过Actuator的HTTP Endpoint,开发人员可以方便地对应用进行监控和管理。

按照上面进行配置后,SpringBoot项目就可以优雅关闭了,只要模拟一个POST请求,在Postman或者其他工具,访问如下路径

:替换成自己项目的host及port,必须是 post
返回

说明SpringBoot应用已优雅关闭

虽然SpringBoot应用已可以优雅关闭了,但是还存在很大的安全隐患,如果有搞破坏的知道了ip、端口号后就可以模拟该请求停止服务了,因此需要增加一些安全限制

登录到SpringBoot应用部署的服务器,本地通过curl执行POST请求

然后可以可到如下输出

说明SpringBoot应用已经优雅且安全的进行了停止

kill -9 pid 是不进行任何等待判断,可以理解为操作系统从内核级别强行杀死某个进程,可模拟为系统宕机、系统断点等特殊情况
kill -15 pid 是等待应用关闭,执行阻塞操作,有时候也会出现无法关闭应用的情况(线上理想情况,是bug就该追根溯源)

以上是关于SpringBoot应用如何以优雅的方式对接老旧SSO实现单点登录逻辑的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot应用优雅重启 - Actuator

SpringBoot定义优雅全局统一Restful API 响应框架三

瞧瞧人家用SpringBoot写的后端API接口,那叫一个优雅

SpringBoot中如何实现业务校验,这种方式才叫优雅!

SpringBoot 如何进行限流?老鸟们都这么玩的!

SpringBoot:如何优雅地处理全局异常?