前言
市场上主流的单点登陆解决方案有以下几种:
- SpringSecurity + OAuth2
- SpringSecurity + CAS 功能较弱,对前后端分离的项目支持不是很好
- Shiro + CAS
- JWT 可以自定义需求,灵活扩展鉴权方式
今天介绍一个国产轻量级单点登陆解决方案XXL-SSO。 XXL-SSO是一个分布式单点登录框架,只需要登录一次就可以访问所有相互信任的应用系统。 拥有"轻量级、分布式、跨域、Cookie+Token均支持、Web+APP均支持"等特性。现已开放源代码,开箱即用。
源码说明
仓库地址
https://github.com/xuxueli/xxl-sso
https://gitee.com/xuxueli0323/xxl-sso
运行环境
- JDK:1.7+
- Redis:4.0+
源码结构
- 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被禁用等,springboot版本部署认证中心
配置文件:application.properties
xxl.sso.redis.address=redis://127.0.0.1:6379xxl.sso.redis.expire.minute=1440先启动redis,再启动认证中心。
可打开CAS登陆地址。
部署客户端-以web方式
配置文件:application.properties
server.port=8081server.servlet.context-path=/xxl-sso-web-sample-springboot### xxl-ssoxxl.sso.server=http://127.0.0.1:8080/xxl-sso-serverxxl.sso.logout.path=/logoutxxl-sso.excluded.paths=xxl.sso.redis.address=redis://127.0.0.1:6379启动成功
访问:http://127.0.0.1:8081/xxl-sso-web-sample-springboot 自动跳转至
http://127.0.0.1:8080/xxl-sso-server/login?redirect_url=http://127.0.0.1:8081/xxl-sso-web-sample-springboot/
实现了对客户端未登陆用户验证。这里我们登陆,方便其它客户端登陆路过验证。
部署第二个WEB客户端
上面客户端jar复制一份,配置文件修改以下部分
server.port=8082server.servlet.context-path=/xxl-sso-web-sample-springboot启动
访问:http://127.0.0.1:8082/xxl-sso-web-sample-springboot
实现了单点登陆,是不是很简单?
登陆和注销流程
正常情况下,登录流程如下:
1、访问 "Client01应用地址" ,将会自动 redirect 到 "SSO认证中心地址" 登录界面。
2、成功登录后,将会自动 redirect 返回到 "Client01应用地址",并切换为已登录状态。
3、此时,访问 "Client02应用地址",不需登陆将会自动切换为已登录状态。
正常情况下,注销流程如下:
1、访问 "Client01应用地址" 配置的 "注销登陆path",将会自动 redirect 到 "SSO认证中心地址" 并自动注销登陆状态。
2、此时,访问 "Client02应用地址",也将会自动注销登陆状态。
部署客户端-以Token方式
论证中心部署方式与上面一样,搭建成功后,默认为Token方式登陆提供以下API接口:
- 1、登陆接口:/app/login
- 2、注销接口:/app/logout
- 3、登陆状态校验接口:/app/logincheck
登陆和注销流程
正常情况下,登录流程如下:

1、获取用户输入的账号密码后,请求SSO Server的登录接口,获取用户 sso sessionid ;(参考代码:TokenClientTest.loginTest) 。
2、登陆成功后,获取到 sso sessionid,需要主动存储,后续请求时需要设置在 Header参数中。
3、此时,使用 sso sessionid 访问受保护的 "Client01应用" 和 "Client02应用" 提供的接口,接口均正常返回(参考代码:TokenClientTest.clientApiRequestTest) 。
正常情况下,注销流程如下:
1、请求SSO Server的注销接口,注销登陆凭证 sso sessionid ;(参考代码:TokenClientTest.logoutTest)。
2、注销成功后,sso sessionid 将会全局失效。
3、此时,使用 sso sessionid 访问受保护的 "Client01应用" 和 "Client02应用" 提供的接口,接口请求将会被拦截,提示未登录并返回状态码 501(参考代码:TokenClientTest.clientApiRequestTest)。
每天一个小知识,每天进步一点点!!![加油][加油][加油]