打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Spring Security基于Oauth2的SSO单点登录怎样做?

  一、说明

  单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼。本文主要介绍 同域 和 跨域 两种不同场景单点登录的实现原理,并使用 Spring Security 来实现一个最简单的跨域 SSO客户端 。

  二、原理说明

  单点登录主流都是基于共享 cookie 来实现的,下面分别介绍 同域 和 跨域 下的两种场景具体怎样实现共享 cookie 的

  2.1. 同域单点登录

  适用场景:都是企业自己的系统,所有系统都使用同一个一级域名通过不同的二级域名来区分。

  举个例子:公司有一个一级域名为 zlt.com ,我们有三个系统分别是:门户系统(sso.zlt.com)、应用1(app1.zlt.com)和应用2(app2.zlt.com),需要实现系统之间的单点登录,实现架构如下:

  核心原理:

  门户系统设置 Cookie 的 domain 为一级域名也就是 zlt.com,这样就可以共享门户的 Cookie 给所有的使用该域名(xxx.zlt.com)的系统

  使用 Spring Session 等技术让所有系统共享 Session

  这样只要门户系统登录之后无论跳转应用1或者应用2,都能通过门户 Cookie 中的 sessionId 读取到 Session 中的登录信息实现单点登录

  2.2. 跨域单点登录

  单点登录之间的系统域名不一样,例如第三方系统。由于域名不一样不能共享 Cookie 了,这样就需要通过一个单独的授权服务(UAA)来做统一登录,并基于共享UAA的 Cookie 来实现单点登录。

  举个例子:有两个系统分别是:应用1(webApp.com)和应用2(zlt.com)需要实现单点登录,另外有一个UAA授权中心(sso.com),实现架构如下:

  核心原理:

  访问系统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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
微服务系统之认证管理详解
公司系统太多,能不能实现账号互通?
写了一个 SSO 单点登录的代码示例给胖友!
java《SSO系列专题》之15分钟让你了解SSO技术是什么
单点登录(全)
Spring Cloud下基于OAUTH2认证授权的实现
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服