基於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的命名方式,解決了這個問題。
總之:會者不難,難者不會,每個坑點,其實都是成長進步的地方,解決了之後,總有收穫,實際實現過程中,
往往都是踩坑過來的。