1. 程式人生 > >基於springboot的shiro sso統一登入系統平臺搭建遇到的坑

基於springboot的shiro sso統一登入系統平臺搭建遇到的坑

概述:

  專案微服務化,搭建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的命名方式,解決了這個問題。

總之:會者不難,難者不會,每個坑點,其實都是成長進步的地方,解決了之後,總有收穫,實際實現過程中,

往往都是踩坑過來的。