作為一個Java入行“多”年的新手(這句話沒毛病,因為一直在做Android),最近又開始做Java的項目您机。
最近在做spring security的集成,用于系統(tǒng)用戶的權(quán)限驗證年局。系統(tǒng)根據(jù)用戶角色和對應(yīng)的資源不同际看,校驗和判斷有無權(quán)限訪問。user-role-rescourc.
spring security ?原理是基于眾多的過濾/攔截器實現(xiàn)矢否。主要通過攔截url仲闽,認證授權(quán),訪問授權(quán)僵朗。
1.spring security shiro的比較
Shiro是一個強大而靈活的開源安全框架赖欣,能夠非常清晰的處理認證、授權(quán)验庙、管理會話以及密碼加密?
1.支持支持多種數(shù)據(jù)源(LDAP顶吮,JDBC,Kerberos粪薛,ActiveDirectory 等)悴了,簡單的身份認證(登錄)
?2.對角色的簡單的簽權(quán)(訪問控制),支持細粒度的簽權(quán)违寿;支持一級緩存湃交,以提升應(yīng)用程序的性能;
3.非常簡單的加密 API藤巢;不跟任何的框架或者容器捆綁搞莺,可以獨立運行。
spring security 除了不能脫離Spring掂咒,shiro的功能它都有才沧。
1.Spring Security支持CAS單點登錄,支持Oauth绍刮、OpenID糜工,Shiro則需要自己手動實現(xiàn)。(這幾個我也沒用過)Spring Security的權(quán)限細粒度更高录淡。
發(fā)了一張spring security sample的截圖
從網(wǎng)上找了一張spring security的驗證執(zhí)行流程圖
2.認證授權(quán)
先看張圖
AuthenticationManager它用來校驗用戶的憑證信息,或者會拋出一個特定的異常(校驗失敗的情況)或者完整填充Authentication對象油坝,將會包含了權(quán)限信息嫉戚。
AuthenticationProvider它為AuthenticationManager提供憑證校驗刨裆。一些AuthenticationProvider的實現(xiàn)基于憑證信息的存儲,如數(shù)據(jù)庫彬檀,來判定憑證信息是否可以被認可帆啃。
spring security 中進行身份驗證的是AuthenticationManager接口,ProviderManager是它的一個默認實現(xiàn)窍帝,但它并不用來處理身份認證努潘,而是委托給配置好的AuthenticationProvider,每個AuthenticationProvider會輪流檢查身份認證坤学。檢查后或者返回Authentication對象或者拋出異常
下圖是從網(wǎng)上找的身份認證的時序圖
AbstractAuthenticationProcessingFilter它在認證請求中使用疯坤。處理包含認證信息的請求,如認證信息可能是form POST提交的深浮,SSO信息或者其他用戶提供的压怠。創(chuàng)建一個部分完整的Authentication對象以在鏈中傳遞憑證信息。
UsernamePasswordAuthentication 繼承 AbstractAuthenticationProcessingFilter飞苇,是系統(tǒng)默認提供的實現(xiàn)類
UsernamePasswordAuthenticationFilter的驗證過程如下:
1. 首先過濾器會調(diào)用自身的attemptAuthentication方法,從request中取出authentication, authentication是在org.springframework.security.web.context.SecurityContextPersistenceFilter過濾器中通過捕獲用戶提交的登錄表單中的內(nèi)容生成的一個org.springframework.security.core.Authentication接口實例.
2. 拿到authentication對象后,過濾器會調(diào)用ProviderManager類的authenticate方法验懊,并傳入該對象
3.ProviderManager類的authenticate方法再調(diào)用自身的doAuthentication方法卧惜,在doAuthentication方法中會調(diào)用類中的Listproviders集合中的各個AuthenticationProvider接口實現(xiàn)類中的authenticate(Authentication authentication)方法進行驗證,由此可見忿等,真正的驗證邏輯是由各個各個AuthenticationProvider接口實現(xiàn)類來完成的,DaoAuthenticationProvider類是默認情況下注入的一個AuthenticationProvider接口實現(xiàn)類
4.AuthenticationProvider接口通過UserDetailsService 接口來獲取用戶信息栖忠,實現(xiàn)loadUserByUsername(String username)方法,至此已經(jīng)認證通過这弧。
3.訪問授權(quán)
spring security 通過攔截訪問的url娃闲,查詢url對應(yīng)的角色或權(quán)限信息,通過對比當前用戶的信息匾浪,判斷是否有權(quán)限訪問
FilterSecurityInterceptor 繼承AbstractSecurityInterceptor是默認實現(xiàn)皇帮,用于訪問攔截
doFilter()方法會攔截到當前訪問的url,并訪問SecurityMetadataSource蛋辈,AccessDecisionManager 接口
SecurityMetadataSource 資源管理器属拾,負責組裝角色資源
AccessDecisionManager,訪問決策管理器冷溶,判定是不是有權(quán)限訪問
可以通過繼承FilterSecurityInterceptor渐白,自定義自己的Filter實現(xiàn)自己的業(yè)務(wù),自定義的需要提供SecurityMetadataSource逞频,AccessDecisionManager纯衍,UserDetailsService的實現(xiàn)
4.最后
掙扎了幾天,完成spring security項目的引入苗胀,中間也跳進過坑襟诸,翻閱過別人的博客瓦堵,最后也慢慢爬出來,在此記錄下最近的學(xué)習過程歌亲。感謝那些之前那些分享經(jīng)驗的人菇用。
初次寫博客,有錯誤的地方陷揪,歡迎同行一起交流惋鸥,指正錯誤。