入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

基于springboot的shiro sso统一登录系统平台搭建遇到的坑

创建时间:2018-01-25 投稿人: 浏览次数:690

概述:

  项目微服务化,搭建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的命名方式,解决了这个问题。



总之:会者不难,难者不会,每个坑点,其实都是成长进步的地方,解决了之后,总有收获,实际实现过程中,

往往都是踩坑过来的。

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像