java单点登录_SpringSecurity基于Oauth2的SSO单点登录怎
样做?⼀个注解搞定
作者简介:
陶陶⽼师
10年后端⼯作经验,
专注Java、SpringBoot、SpringCloud、分布式系统/微服务、中间件等领域。
掘⾦专栏:zlt2000 的个⼈主页 - 掘⾦
⼀、说明
单点登录顾名思义就是在多个应⽤系统中,只需要登录⼀次,就可以访问其他相互信任的应⽤系统,免除多次登录的烦恼。本⽂主要介绍同域 和 跨域 两种不同场景单点登录的实现原理,并使⽤ Spring Security 来实现⼀个最简单的跨域 SSO客户端 。
⼆、原理说明
单点登录主流都是基于共享 cookie 来实现的,下⾯分别介绍 同域 和 跨域 下的两种场景具体怎样实现共享 cookie 的
session如何设置和读取2.1. 同域单点登录
适⽤场景:都是企业⾃⼰的系统,所有系统都使⽤同⼀个⼀级域名通过不同的⼆级域名来区分。
举个例⼦:公司有⼀个⼀级域名为 zlt ,我们有三个系统分别是:门户系统(sso.zlt)、应⽤1(app1.zlt)和应⽤
2(app2.zlt),需要实现系统之间的单点登录,实现架构如下:
核⼼原理:
门户系统设置 Cookie 的 domain 为⼀级域名也就是 zlt,这样就可以共享门户的 Cookie 给所有的使⽤该域名(xxx.zlt)的系统
使⽤ Spring Session 等技术让所有系统共享 Session
这样只要门户系统登录之后⽆论跳转应⽤1或者应⽤2,都能通过门户 Cookie 中的 sessionId 读取到 Session 中的登录信息实现单点登录
2.2. 跨域单点登录
单点登录之间的系统域名不⼀样,例如第三⽅系统。由于域名不⼀样不能共享 Cookie 了,这样就需要通过⼀个单独的授权服务(UAA)来做统⼀登录,并基于共享UAA的 Cookie 来实现单点登录。
举个例⼦:有两个系统分别是:应⽤1(webApp)和应⽤2(zlt)需要实现单点登录,另外有⼀个UAA授权中⼼(sso),实现架构如下:
核⼼原理:
访问系统1判断未登录,则跳转到UAA系统请求授权
在UAA系统域名 sso 下的登录地址中输⼊⽤户名/密码完成登录
登录成功后UAA系统把登录信息保存到 Session 中,并在浏览器写⼊域为 sso 的 Cookie
访问系统2判断未登录,则跳转到UAA系统请求授权
由于是跳转到UAA系统的域名 sso 下,所以能通过浏览器中UAA的 Cookie 读取到 Session 中之前的登录信息完成单点登录
2.3. 基于Oauth2的跨域单点登录流程
关于Oauth2的授权码模式这⾥就不做介绍了,⾃⾏资料了解
三、Spring Security实现
Oauth2单点登录除了需要授权中⼼完成统⼀登录/授权逻辑之外
基于 Spring Security 实现的UUA统⼀授权中⼼可以参考:zlt2000/microservices-platform 各个系统本⾝(sso客户端)也需要实现以下逻辑:
拦截请求判断登录状态
与 UAA授权中⼼ 通过 Oauth2授权码模式 交互完成登录/单点登录
保存⽤户登录信息
以上逻辑只需使⽤⼀个 @EnableOAuth2Sso 注解即可实现
SpringBoot配置如下:
下图是访问sso客户端时@EnableOAuth2Sso注解与UAA授权中⼼通过Oauth2授权码模式交互完成单点登录的步骤
请结合上⾯单点时序图中单点登录系统2的1~5步
PS:如果系统⽤的不是 Spring Security 怎么办?理解原理⾃⾏实现
四、demo下载地址
zlt2000/microservices-platform
作者简介:
陶陶⽼师
10年后端⼯作经验,
专注Java、SpringBoot、SpringCloud、分布式系统/微服务、中间件等领域。
掘⾦专栏:zlt2000 的个⼈主页 - 掘⾦
本⽂已经获得陶陶⽼师授权转发,其他⼈若有兴趣转载,请直接联系作者授权。
更多的学习资料,请看这⾥:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论