作者简介:
陶陶老师
10年后端工作经验,
专注Java、SpringBoot、SpringCloud、分布式系统/微服务、中间件等领域。
公众号:陶陶技术笔记
一、说明
单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼。本文主要介绍 同域 和 跨域 两种不同场景单点登录的实现原理,并使用 Spring Security 来实现一个最简单的跨域 SSO客户端 。
二、原理说明
单点登录主流都是基于共享 cookie 来实现的,下面分别介绍 同域 和 跨域 下的两种场景具体怎样实现共享 cookie 的
2.1. 同域单点登录
适用场景:都是企业自己的系统,所有系统都使用同一个一级域名通过不同的二级域名来区分。
举个例子:公司有一个一级域名为 zlt.com ,我们有三个系统分别是:门户系统(sso.zlt.com)、应用1(app1.zlt.com)和应用2(app2.zlt.com),需要实现系统之间的单点登录,实现架构如下:
核心原理:
访问系统1判断未登录,则跳转到UAA系统请求授权
在UAA系统域名 sso.com 下的登录地址中输入用户名/密码完成登录
登录成功后UAA系统把登录信息保存到 Session 中,并在浏览器写入域为 sso.com 的 Cookie
访问系统2判断未登录,则跳转到UAA系统请求授权
由于是跳转到UAA系统的域名 sso.com 下,所以能通过浏览器中UAA的 Cookie 读取到 Session 中之前的登录信息完成单点登录
2.3. 基于Oauth2的跨域单点登录流程
核心原理:
访问系统1判断未登录,则跳转到UAA系统请求授权
在UAA系统域名 sso.com 下的登录地址中输入用户名/密码完成登录
登录成功后UAA系统把登录信息保存到 Session 中,并在浏览器写入域为 sso.com 的 Cookie
访问系统2判断未登录,则跳转到UAA系统请求授权
由于是跳转到UAA系统的域名 sso.com 下,所以能通过浏览器中UAA的 Cookie 读取到 Session 中之前的登录信息完成单点登录
2.3. 基于Oauth2的跨域单点登录流程
关于Oauth2的授权码模式这里就不做介绍了,自行找资料了解
三、Spring Security实现
Oauth2单点登录除了需要授权中心完成统一登录/授权逻辑之外
基于 Spring Security 实现的UUA统一授权中心可以参考:https://gitee.com/zlt2000/microservices-platform/tree/master/zlt-uaa
各个系统本身(sso客户端)也需要实现以下逻辑:
拦截请求判断登录状态
与 UAA授权中心 通过 Oauth2授权码模式 交互完成登录/单点登录
保存用户登录信息
以上逻辑只需使用一个 @EnableOAuth2Sso 注解即可实现
SpringBoot配置如下:
下图是访问 sso客户端 时 @EnableOAuth2Sso 注解与 UAA授权中心 通过 Oauth2授权码模式 交互完成单点登录的步骤
请结合上面单点时序图中单点登录系统2的1~5步
PS:如果系统用的不是 Spring Security 怎么办?理解原理自行实现
四、demo下载地址
https://gitee.com/zlt2000/microservices-platform/tree/master/zlt-demo/sso-demo
作者简介:
陶陶老师
10年后端工作经验,
专注Java、SpringBoot、SpringCloud、分布式系统/微服务、中间件等领域。
公众号:陶陶技术笔记
本文已经获得陶陶老师授权转发,其他人若有兴趣转载,请直接联系作者授权。