您的位置:首页 > 编程语言 > Java开发

基于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中移除。如下

@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的命名方式,解决了这个问题。

总之:会者不难,难者不会,每个坑点,其实都是成长进步的地方,解决了之后,总有收获,实际实现过程中,
往往都是踩坑过来的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐