淘东电商项目(31) -SSO单点登录(XXL-SSO案例)

引言

本文代码已提交至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/taodong-shop

对单点登录这个概念还不懂的同学,可以参考我之前写的一篇博客《单点登录(SSO)看这一篇就够了》

本文主要讲解单点登录集成到我们的电商项目,没有使用CAS框架,使用的是国产XXL-SSO框架,其原理大同小异,不影响思路。

阅读本文之前用一句话来概括单点登录的作用:

  • “单点登录主要解决多个系统,统一登录”

本文目录结构:
l____引言
l____ 1. XXL-SSO框架
l____ 2. 单点登录原理(Cookie形式)
l________ 2.1 登录流程
l________ 2.2 登出流程
l____ 3. 官方Demo分析
l________ 3.1 SSO Server中央认证服务
l________ 3.2 SSO Client应用(Cookie形式)
l________ 3.3 SSO Client应用(Token形式)
l____总结

1. XXL-SSO框架

我们先登录XXL-SSO官网:https://www.xuxueli.com/xxl-sso/
在这里插入图片描述

从上图可以看到XXL-SSO分布式单点登录框架有如下特性:

  • 轻量级
  • 分布式
  • 跨域
  • Cookie+Token均支持
  • Web+APP均支持

这些特性中,按功能分,我觉得主要是第三点“Cookie+Token均支持”,那这两种形式又是如何的呢?下文将详细描述。

2. 单点登录原理(Cookie形式)

学习单点登录前,必须了解下面几个角色:

概念 说明
SSO Server 中央认证服务,支持集群
SSO Client 接入SSO认证中心的Client应用(也就是我们的业务服务)
SSO SessionId 登录用户会话ID,SSO 登录成功为用户自动分配
SSO User 登录用户信息,与 SSO SessionId 相对应

2.1 登录流程

那Cookie形式如何实现单点登录的呢?官网的图是这样的:
在这里插入图片描述
登录流程:

  1. 用户Client端访问时会经过Filter,判断是否登录,如果没有登录,将会自动 redirect 到 SSO Server 进入统一登录界面。
  2. 用户登录成功之后SSO Server将会为用户分配 SessionId 并 redirect 返回来源Client端应用,同时附带分配的 SessionId。这是SSO Server域名下的Cookie也会写入SessionId。
  3. redirect返回后,在Client端的SSO Filter里验证 SessionId 无误,将 SessionId 写入到用户浏览器Client端域名下 cookie 中。
  4. SSO Filter验证 SessionId 通过,请求放行,登录成功。
  5. 另外一个Client访问时,也会进入Filter,因为SSO Server已经登录了,所以直接redirect,即走第2、3、4步了。

很多的人会问,第5步中,对“SSO Server已经登录,所以直接redirect,走2、3、4步”这一句话不是很理解,那如果换了浏览器,为什么就不能直接登录呢?

其实我曾经也有过这个疑问,其实不要忘记了还有第3步骤,SSO Server登录成功后,也会把SessoinId放入浏览器的Cookie中的,也就是放到SSO Server域名下的Cookie中,而新的浏览器中,SSO Server域名下Cookie没有登录成功返回的SessionId,所以SSO Server就判断该Client没有登录了

2.2 登出流程

登出流程又是如何的呢?

  1. 用户与Client端应用请求注销Path时,将会 redirect 到 SSO Server 自动销毁全局 SSO SessionId,实现全局销毁。
  2. 然后,访问接入SSO保护的任意Client端应用时,SSO Filter 均会拦截请求并 redirect 到 SSO Server 的统一登录界面。

3. 官方Demo分析

首先我们从Github 克隆XXL-SSO的源码到本地(https://github.com/xuxueli/xxl-sso.git):
在这里插入图片描述
下载完源码,我们可以看到目录结构如下:
在这里插入图片描述

3.1 SSO Server中央认证服务

打开xxl-sso-server目录,可以看到有如下结构:
在这里插入图片描述
他们分别表示:

config interceptor resolver AppController WebController core service
配置 过滤器 全局异常捕获 App访问控制层 Web访问控制层 相关实体类 用户信息验证服务

打开xxl-sso-server的配置文件,可以看到需要配置Redis地址,在这里配置好Redis地址:
在这里插入图片描述
启动xxl-sso-server,报错了,内容如下:
在这里插入图片描述
其实是日志文件目录未找到,所以要修改日志文件目录,打开logback.xml文件:
修改log.path对应的value值为:./log/xxl-sso-server.log:
在这里插入图片描述
再次启动,可以看到启动成功:
在这里插入图片描述

3.2 SSO Client应用(Cookie形式)

SSO 认证中心已经配置好并打开了,下面我们来看看SSO Client端。

打开samples下的xxl-sso-web-sample-springboot项目,并配置redis路径(与认证中心的一致):
在这里插入图片描述
在上图可以看到xxl.sso.server对应的值为:http://xxlssoserver.com:8080/xxl-sso-server,这里用到了域名,所以要在我们本地localhost文件里配置域名(不懂配置的可以查看我之前写过的文章《Mac 或Windows下配置hosts文件》),我的配置如下:
在这里插入图片描述

启动SSO-Client端,发现报错了,内容如下,也是日志的问题,处理方式同SSO Server一样,修改logback.xml的日志文件路径就好了。
在这里插入图片描述

再次启动,启动成功:
在这里插入图片描述
浏览器输入:http://xxlssoclient1.com:8081/xxl-sso-web-sample-springboot
在这里插入图片描述
可以看到自动跳转到了SSO 认证服务中心的登录页面了,url地址变为如下,可以看到携带了一个redirect_url,指的就是登录成功后重定向的地址:
http://xxlssoserver.com:8080/xxl-sso-server/login?redirect_url=http://xxlssoclient1.com:8081/xxl-sso-web-sample-springboot/

为了更好的验证单点登录,我们复制xxl-sso-web-sample-springboot项目命名为xxl-sso-web-sample-springboot8083,并设置端口号为8083:
在这里插入图片描述
并在hosts文件增加配置:
在这里插入图片描述
启动复制的项目

好了,可以开始验证了。首先浏览器输入Client1服务地址:http://xxlssoclient1.com:8081/xxl-sso-web-sample-springboot,会自动跳转到授权中心:
在这里插入图片描述
点击登录,可看到登录成功,而且登录成功后的sessionid在地址栏也能看到。
在这里插入图片描述
接下来看看Client2是否需要再次登录,浏览器输入:http://xxlssoclient2.com:8083/xxl-sso-web-sample-springboot
在这里插入图片描述
可以看到Client2也登录成功了,而且sessionid与Client1的一样。

最后,我们看看浏览器的Cookie信息,观察发现他们的sessionid也是一致的:

clinent1 client2
在这里插入图片描述 在这里插入图片描述

打开Redis可视化窗口,可以看到Redis服务器有保存SessionId:
在这里插入图片描述

3.3 SSO Client应用(Token形式)

其实基于Token的形式去单点登录与基于Cookie形式大同小异的。相对于Cookie的形式,只是少了个跳转登录界面。根据xxl-sso的官方文档,直接使用PostMan来演示。

首先演示登录(url:http://xxlssoserver.com:8080/xxl-sso-server/app/login?username=user&password=123456
在这里插入图片描述
可以是直接访问了SSO Server的登录接口,返回的data就是sessoinid了,其它客户端可以使用这个sessionid来实现单点登录。

启动xxl-sso-token-sample-springboot项目(端口号8082):
在这里插入图片描述
postman请求,注意sessionid放到请求头:
在这里插入图片描述
登录成功!

总结

本文主要讲解了单点登录的相关概念,已经使用xxl-sso框架来做演示。

发布了2681 篇原创文章 · 获赞 5108 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/qq_20042935/article/details/104899197
今日推荐