一、介绍
XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。
拥有”轻量级、分布式、跨域、Cookie+Token均支持、Web+APP均支持”等特性。现已开放源代码,开箱即用。
官方文档
二、集成
2.1、源码下载
下载地址
2.2、代码结构
2.3、修改server端配置
2.4、修改client端配置
2.5、配置说明
配置 | 说明 |
---|---|
xxl.sso.server | SSO Server端地址 |
xxl.sso.logout.path | 登出地址(当请求地址是该地址时,会自动出发过滤器中的逻辑,清除redis和cookie中的用户信息,但是退出之后跳转到的Server端登录页后面不携带本系统的地址,所以再次登录时无法正确跳转到本系统,而是进入Server端) |
xxl-sso.excluded.paths | 路径排除Path,允许设置多个,且支持Ant表达式。用于排除SSO客户端不需要过滤的路径 |
xxl.sso.redis.address | redis address, like “{ip}”、“{ip}:{port}”、“{redis/rediss}😕/xxl-sso:{password}@{ip}:{port:6379}/{db}”;Multiple “,” separated |
2.6、测试
2.6.1、分别启动Server端和Client端
Server端地址:http://127.0.0.1:8080/xxl-sso-server/
Client端地址:http://127.0.0.1:8081/xxl-sso-web-sample-springboot/
三、问题
3.1、客户端点击退出后,跳转到服务端,但是此时服务端的URL后并没有拼接客户端的地址,导致再次在服务端登录之后无法正常跳转到客户端
可以看到客户端中的XxlSsoWebFilter过滤器,也只是重定向到了服务端,并未拼接上客户端的地址信息
解决方案:直接请求服务端的退出逻辑,直接让前端请求服务端的logout接口,或者后端自己重定向到这个接口
3.2、样例无法启动
Exception in thread "main" java.lang.ClassCastException: class jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to class java.net.URLClassLoader (jdk.internal.loader.ClassLoaders$AppClassLoader and java.net.URLClassLoader are in module java.base of loader 'bootstrap')
at org.springframework.boot.devtools.restart.DefaultRestartInitializer.getUrls(DefaultRestartInitializer.java:92)
at org.springframework.boot.devtools.restart.DefaultRestartInitializer.getInitialUrls(DefaultRestartInitializer.java:56)
at org.springframework.boot.devtools.restart.Restarter.<init>(Restarter.java:139)
at org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:575)
at org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationStartingEvent(RestartApplicationListener.java:65)
at org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationEvent(RestartApplicationListener.java:44)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:122)
at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:69)
at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:47)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:292)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1082)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1071)
at com.xxl.sso.server.XxlSsoServerApplication.main(XxlSsoServerApplication.java:13)
Disconnected from the target VM, address: '127.0.0.1:50178', transport: 'socket'
这里将POM中的热部署依赖移除便可以正常启动
四、总结
XXL-SSO的原理其实非常的简单
用户访问系统,如果没有登录会被重定向到服务端,在服务端进行登录,登录之后会将生成的认证信息存储在Cookie中,这样,同一个浏览器中的系统请求的时候都会携带上Cookie,这样就可以通过拦截器判断该用户是否登录,以此来实现单点登录的效果
XXL-SSO的集成非常简单,本身也非常的纯粹,没有过多的额外功能,所以登录部分的逻辑是需要自己开发的