参考教程:https://www.cnblogs.com/ywlaker/p/6113927.html
代码:https://github.com/YounianC/sso-example
模块
- a1 :测试项目Application1
- ssoclient:sso客户端,用于宿主项目
- ssoserver:sso服务端,即真正登录项目
部署:
- a1 启动于tomcat 8081端口
- a1 启动于tomcat 8082端口,模拟其他项目
- ssoserver启动于tomcat 8080端口
集成sso-client
<dependency>
<groupId>me.younian</groupId>
<artifactId>sso-client</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<filter>
<filter-name>authFilter</filter-name>
<filter-class>me.younian.ssoclient.filter.AuthRequireFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>authFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 添加配置文件:sso-config.properties
AuthInterfaceImplClass=me.younian.a1.auth.AuthImplRedis
ServerUrl=http://server.com:8080
LogoutUrl=/logout
ApplicaitonName=a1
hosts
添加hosts:
127.0.0.1 server.com
127.0.0.1 a1.com
127.0.0.1 a2.com
重要,访问一定要使用hosts,否则多个项目都在localhost下、使用localhost访问会出现sessionid混乱问题。
最终效果
-
首次访问 a1.com:8081/index 会自动跳转到 http://server.com:8080/login?callback=http://a1.com:8081/index
-
在登录页面输入用户名密码即可登录,成功会自动调回 a1.com:8081/index 并附带token
-
再次访问 a1.com:8081/index 无需登录
-
访问 a2.com:8082/index 会自动跳转并且调回,无需操作即可登录。
-
a1项目首次登陆

-
a2项目无需登陆

-
访问a1注销链接:a1.com:8081/logout ,会相应注销其他子系统。

可优化项目
使用db存储token,不仅仅使用session,利于后期集群。
尽量少的代码集成sso-client
- 优化认证来源日志
登出,需要通知所有项目全部登出。
分离session硬编码,做成宿主项目可编码管理token和session
问题
在文章的第8步:

这里的代码有点问题,作者原意是sso-client使用http请求sso-server的logout接口,sso-server收到请求后使session失效,但是:
- 用户跳转到sso-server登录后会在sso-server保存响应的session信息,这个session是 关联到用户浏览器的。
- 但是在第8步使用http请求sso-server的logout,这个时候销毁的session是 相对于本次http请求的,用户浏览器的session依然没有销毁。
- 所以需要在sso-server存储token和session的映射,调用logout时通过token销毁对应的session。