基于springboot的shiro sso统一登录系统平台搭建遇到的坑
2018-01-25 13:19
741 查看
概述:
项目微服务化,搭建sso统一登录平台,使用共享JID,完成统一登录授权功能,下文记录遇到的主要的坑。
1.策略选择问题
2.springboot,shirofilter加载拦截顺序问题
3.shiroHttpSession代理httpSession后,对象无法正常序列化的问题
4.缓存刷新问题
5.JSESSIONID命名问题
问题1.策略选择问题
工程技术springboot+redis+shiro,最终决定通过在用户登录系统完成subject的登录后,把生成的sessionID作为参数,传递到
需要被登录授权的系统,由授权系统从redis中根据这个key取缓存用户信息。
并绑定本地被授权系统的request sessionid,来防止JID泄露导致的数据安全问题。
坑点:策略选定过程的摇摆和尝试,有尝试过使用oauth2来实现,但发现基于微服务后,oauth2授权方式过重了;
也考虑过将session,完整保存入redis的方式,替代sessionDao的模式,然而因为实现问题,还是选择了放弃。
2.springboot,shirofilter加载拦截顺序问题
坑点:自定义了拦截器后,发现anon与自动义拦截器没有实现互斥效果,每次都进入了自定义拦截中,后来发现是spring
filterChain
与shirofilter的管理问题,于是把自定义filter从sping filterChain中移除。如下
3.shiroHttpSession代理httpSession后,对象无法正常序列化的问题
坑点:在把user对象放入session中时,报序列化异常,经排查,发现shiroHttpSession代理了httpSession,shiroHttpSession
无法正常取出序列化的对象User,于是决定把被授权系统的shiroHttpSession还原为httpSession,发现有效,虽然方法已经过时,
但经使用发现无其他影响,于是正式采用。配置如下:
4.缓存刷新问题
坑点:因为一开始使用的是GET方式传递JID,缓存刷新后,无法判断用户已经清空了本地浏览器缓存,统一全部改为POST方式
解决了这个问题。
5.JSESSIONID命名问题
坑点:一开始将传递的共享JID命名为变量JSESSIONID,导致tomcat自动生成的JSESSIONID与自动义的ID冲突,而导致
不定时找不到sessionid的异常,通过全部把JSESSIONID改为JID的命名方式,解决了这个问题。
总之:会者不难,难者不会,每个坑点,其实都是成长进步的地方,解决了之后,总有收获,实际实现过程中,
往往都是踩坑过来的。
项目微服务化,搭建sso统一登录平台,使用共享JID,完成统一登录授权功能,下文记录遇到的主要的坑。
1.策略选择问题
2.springboot,shirofilter加载拦截顺序问题
3.shiroHttpSession代理httpSession后,对象无法正常序列化的问题
4.缓存刷新问题
5.JSESSIONID命名问题
问题1.策略选择问题
工程技术springboot+redis+shiro,最终决定通过在用户登录系统完成subject的登录后,把生成的sessionID作为参数,传递到
需要被登录授权的系统,由授权系统从redis中根据这个key取缓存用户信息。
并绑定本地被授权系统的request sessionid,来防止JID泄露导致的数据安全问题。
坑点:策略选定过程的摇摆和尝试,有尝试过使用oauth2来实现,但发现基于微服务后,oauth2授权方式过重了;
也考虑过将session,完整保存入redis的方式,替代sessionDao的模式,然而因为实现问题,还是选择了放弃。
2.springboot,shirofilter加载拦截顺序问题
坑点:自定义了拦截器后,发现anon与自动义拦截器没有实现互斥效果,每次都进入了自定义拦截中,后来发现是spring
filterChain
与shirofilter的管理问题,于是把自定义filter从sping filterChain中移除。如下
@Bean public FilterRegistrationBean registration(SsoAuthenticationFilter filter) { FilterRegistrationBean registration = new FilterRegistrationBean(filter); registration.setEnabled(false); return registration; }
3.shiroHttpSession代理httpSession后,对象无法正常序列化的问题
坑点:在把user对象放入session中时,报序列化异常,经排查,发现shiroHttpSession代理了httpSession,shiroHttpSession
无法正常取出序列化的对象User,于是决定把被授权系统的shiroHttpSession还原为httpSession,发现有效,虽然方法已经过时,
但经使用发现无其他影响,于是正式采用。配置如下:
@Bean(name = "shiroFilter") public ShiroDbFilterFactoryBean shiroDbFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager, JCaptchaValidateFilter jCaptchaValidateFilter, SsoAuthenticationFilter ssoAuthenticationFilter) { ShiroDbFilterFactoryBean shiroDbFilterFactoryBean = new ShiroDbFilterFactoryBean(); defaultWebSecurityManager.setSessionMode(defaultWebSecurityManager.HTTP_SESSION_MODE); shiroDbFilterFactoryBean.setSecurityManager(defaultWebSecurityManager); shiroDbFilterFactoryBean.setLoginUrl("/testUserS/login.html"); shiroDbFilterFactoryBean.setSuccessUrl("/testUserS/info.html"); Map<String, Filter> filter = new LinkedHashMap<String, Filter>(); filter.put("jcaptchaVf", jCaptchaValidateFilter); filter.put("ssoAuthenticationFilter", ssoAuthenticationFilter); shiroDbFilterFactoryBean.setFilters(filter); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); filterChainDefinitionMap.put("/swagger-ui.html", "anon"); filterChainDefinitionMap.put("/*", "ssoAuthenticationFilter"); shiroDbFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroDbFilterFactoryBean; }
4.缓存刷新问题
坑点:因为一开始使用的是GET方式传递JID,缓存刷新后,无法判断用户已经清空了本地浏览器缓存,统一全部改为POST方式
解决了这个问题。
5.JSESSIONID命名问题
坑点:一开始将传递的共享JID命名为变量JSESSIONID,导致tomcat自动生成的JSESSIONID与自动义的ID冲突,而导致
不定时找不到sessionid的异常,通过全部把JSESSIONID改为JID的命名方式,解决了这个问题。
总之:会者不难,难者不会,每个坑点,其实都是成长进步的地方,解决了之后,总有收获,实际实现过程中,
往往都是踩坑过来的。
相关文章推荐
- 多平台的网站实现单点登录系统(SSO)的开发思路 让你的会员中心更加统一(参考资料)
- JeeFast是一款基于SpringBoot+Mybatis-Plus+Bootstrap+Vue搭建的JAVA WEB快速开发平台
- shiro集成cas搭建SSO单点登录系统
- springboot+shiro+cas实现单点登录之shiro端搭建
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- Spring+Shiro搭建基于Redis的分布式权限系统(有实例)
- 基于springboot的框架搭建(2)统一配置mybatis的增删改方法
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)
- springboot+shiro+cas实现单点登录之cas server搭建
- shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃
- 基于shiro-cas的单点登录、单点登出、统一认证授权系统
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- JeeFast是一款基于SpringBoot+Mybatis-Plus+Bootstrap+Vue搭建的JAVA WEB快速开发平台
- spring+shiro+jasig-cas+cxf 单点登录多点注销简单统一权限管理平台 二
- 单点登录系统实现基于SpringBoot
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- 基于CAS的单点登录SSO[5]: 基于Springboot实现CAS客户端的前后端分离
- Spring+Shiro搭建基于Redis的分布式权限系统(有实例)
- 基于springboot+redis+bootstrap+mysql开发一套属于自己的分布式springcloud云权限架构(十七)【权限架构系统(基础框架搭建)】
- spring+shiro+jasig-cas+cxf 单点登录多点注销简单统一权限管理平台