有关单点登录(SSO)之前有写过两篇文章
如果说XXL-JOB你可能并不陌生,它是非常火爆的一个分布式任务调度平台。但其实在该作者还有一个非常优秀的开源项目叫XXL-SSO,这两个个项目都是1000+Star。
XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有"轻量级、分布式、跨域、Cookie+Token均支持、Web+APP均支持"等特性。现已开放源代码,开箱即用。
这里主要是通过对XXL-SSO源码的分析,将理论和实践结合!
一、快速接入sso
1、xxl-sso特性
- 简洁:API直观简洁,可快速上手
- 轻量级:环境依赖小,部署与接入成本较低
- 单点登录:只需要登录一次就可以访问所有相互信任的应用系统
- 分布式:接入SSO认证中心的应用,支持分布式部署
- HA:Server端与Client端,均支持集群部署,提高系统可用性
- 跨域:支持跨域应用接入SSO认证中心
- Cookie+Token均支持:支持基于Cookie和基于Token两种接入方式,并均提供Sample项目
- Web+APP均支持:支持Web和APP接入
- 实时性:系统登陆、注销状态,全部Server与Client端实时共享
- CS结构:基于CS结构,包括Server"认证中心"与Client"受保护应用"
- 记住密码:未记住密码时,关闭浏览器则登录态失效;记住密码时,支持登录态自动延期,在自定义延期时间的基础上,原则上可以无限延期
- 路径排除:支持自定义多个排除路径,支持Ant表达式,用于排除SSO客户端不需要过滤的路径
2、环境
- JDK:1.7+
- Redis:4.0+
3、 源码地址
4、 项目结构说明
- xxl-sso-server:中央认证服务,支持集群
- xxl-sso-core:Client端依赖
- xxl-sso-samples:单点登陆Client端接入示例项目
- xxl-sso-web-sample-springboot:基于Cookie接入方式,供用户浏览器访问,springboot版本
- xxl-sso-token-sample-springboot:基于Token接入方式,常用于无法使用Cookie的场景使用,如APP、Cookie被禁
5、 架构图
应用系统
:sso-web系统(8081端口)、sso-web系统(8082端口)(需要登录的系统)
SSO客户端
:登录、退出(独立jar包给应用系统引用)
SSO服务端
:登录(登录服务)、登录状态(提供登录状态校验/登录信息查询的服务)、退出(用户注销服务)
数据库
:存储用户账户信息(一般使用Mysql,在当前项目中为了简便并没有查询数据库)
缓存
:存储用户的登录信息(使用Redis)
二、快速接入XXL-SSO框架
1、 部署认证中心(sso-server)
只需要修改配置文件即可,配置文件位置:application.properties
## 配置redis
xxl.sso.redis.address=redis://118.31.224.65:6379
## 登录态有效期窗口,默认24H,当登录态有效期窗口过半时,自动顺延一个周期
xxl.sso.redis.expire.minute=1440
2、 部署'单点登陆Client端接入示例项目'
这里指需要接入SSO的系统,在当前项目有xxl-sso-web-sample-springboot和 xxl-sso-token-sample-springboot两个示例项目,这里暂且以sso-web为示例。
1)、maven依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-sso-core</artifactId>
<version>${最新稳定版}</version>
</dependency>
2)配置 XxlSsoFilter
参考代码:com.xxl.sso.sample.config.XxlSsoConfig
@Bean
public FilterRegistrationBean xxlSsoFilterRegistration() {
// xxl-sso, redis init
JedisUtil.init(xxlSsoRedisAddress);
// xxl-sso, filter init
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setName("XxlSsoWebFilter");
registration.setOrder(1);
registration.addUrlPatterns("/*");
registration.setFilter(new XxlSsoWebFilter());
registration.addInitParameter(Conf.SSO_SERVER, xxlSsoServer);
registration.addInitParameter(Conf.SSO_LOGOUT_PATH, xxlSsoLogoutPath);
return registration;
}
application.properties
修改
## 中央认证服务地址
xxl.sso.server=http://ssoserver.com:8080/xxl-sso-server
## 退出接口
xxl.sso.logout.path=/logout
## 排除走sso的接口
xxl-sso.excluded.paths=/excludedUrl
## redis地址
xxl.sso.redis.address=redis://118.11.214.65:6379
三、快速验证
1、修改host文件
修改Host文件:域名方式访问认证中心,模拟跨域与线上真实环境
127.0.0.1 ssoserver.com
127.0.0.1 webb.com
127.0.0.1 weba.com
2、启动项目
分别运行 “xxl-sso-server” 与 “xxl-sso-web-sample-springboot”,为了验证单点登录,这里sso-web需求启动两次,只是一次是8081端口,一次是8082端口。
## 1、SSO认证中心地址:
http://ssoserver.com:8080/xxl-sso-server
## 2、Client01应用地址:
http://weba.com:8081/xxl-sso-web-sample-springboot/
## 3、Client