spring security簡單介紹
這裡是修真院後端小課堂,每篇分享文從
【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】
八個方面深度解析後端知識/技能,本篇分享的是:
【spring security簡單介紹】
大家好,我是IT修真院北京分院第34期的學員嶽曉鵬,一枚正直純潔善良的java程式設計師,今天給大家分享一下,修真院官網java任務八,深度思考中的知識點——spring security簡單介紹
(1)背景介紹:
Spring security
Spring Security是一個基於Java / Java EE的框架,為企業應用程式提供身份驗證,授權和其他安全功能。該專案於2003年底開始,作為'Acegi Security'(發音為Ah-see-gee) 被Ben Alex於2004年3月在Apache License下公開發布。隨後,Acegi被納入Spring組合作為Spring Security,一個官方的Spring子專案。新名稱下的第一個公開發布是2008年4月的Spring Security 2.0.0,SpringSource提供了商業支援和培訓。目前的最新版本為spring security4。
(2)知識剖析:
Spring security在安全方面所處的層次;
安全是一個不斷演進的目標,追求一個全面的、系統級別的安全方案是非常重要的。站在安全領域的角度,我們鼓勵分層的概念,每一層都只管理自己職責範圍內的安全問題,每一層的安全機制越嚴格,我們的應用就越健壯、越安全。
1、在最底層,我們需要處理傳輸層安全和系統識別。
2、接著我們會使用防火牆,可能會聯合VPN或者IP安全機制來保證只有被授權的系統才能進行連線。
3、在企業環境中,我們需要部署一個DMZ( demilitarized zone )服務來隔離對外提供訪問的介面的伺服器與內部資料庫和應用伺服器。
4、我們的作業系統也扮演了安全中的一環,例如使用不具有特定許可權的使用者執行程序,限制使用者最大可以操作的檔案數量等。作業系統通常也會配置自己的防火牆。
5、我們可能還會嘗試使阻止DDOS( Distributed DenialofService)分散式拒絕服務和暴力破解攻擊(brute force attacks )。一個入侵檢測系統對於攻擊的監控和響應是非常有用的,可以幫助我們實時的拒絕某些TPC/IP地址的訪問。
6、從更高的層面即JVM的層面來說,我們可以通過配置最小化一個Java類可以具有的許可權(譯者注:通過JAVA_HOME/jre/lib/security/java.policy檔案進行配置)
7、最後我們在應用層面新增一些領域特定的安全配置。
Spring Security可以讓最後一點,即應用相關的安全( application security )設定變得更加容易。
許可權認證的“套路”----驗證和授權
應用級別的安全主要分為“驗證( authentication) ”和“(授權) authorization ”兩個部分。這也是Spring Security主要需要處理的兩個部分。“ Authentication ”指的是建立規則( principal )的過程。規則可以是一個使用者、裝置、或者其他可以在我們的應用中執行某種操作的其他系統。" Authorization "指的是判斷某個 principal 在我們的應用是否允許執行某個操作。在進行授權判斷之前,要求其所要使用到的規則必須在驗證過程中已經建立好了。
spirng支援的驗證方式
HTTP BASIC authentication headers (an IETF RFC-based standard)認證頭
HTTP Digest authentication headers (an IETF RFC-based standard)
HTTP X.509 client certificate exchange (an IETF RFC-based standard)
LDAP (a very common approach to cross-platform authentication needs, especially in large environments)
Form-based authentication (for simple user interface needs)
OpenID authentication
Authentication based on pre-established request headers (such as Computer Associates Siteminder)
。。。。
通用的許可權模型----許可權五張表;
使用者,角色,使用者角色關聯表,角色,角色許可權關聯表;
任何許可權的需求,都是為廣義的使用者分配角色,角色擁有廣義的許可權。
角色是最重要的中樞,隱藏做幕後黑手,從不出現在業務程式碼裡,用行話說就是解除了使用者和許可權的直接耦合。
角色把使用者抽象化了,幾百個使用者變成成幾個角色,使用者->角色->許可權寫成通用判斷許可權的方法:currUser.IsHave(xx許可權)。核心就是一個sql聯表查詢語句,查詢條件為使用者id。
在Spring Security4的使用中,有4種方法:
一種是全部利用配置檔案,將使用者、許可權、資源(url)硬編碼在xml檔案或java程式碼中;
二種是使用者和許可權用資料庫儲存,而資源(url)和許可權的對應採用硬編碼配置。
三種是細分角色和許可權,並將使用者、角色、許可權和資源均採用資料庫儲存,並且自定義過濾器,代替原有的FilterSecurityInterceptor過濾器,並分別實現AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,並在配置檔案中進行相應配置。
四是修改spring security的原始碼,主要是修改InvocationSecurityMetadataSourceService和UserDetailsService兩個類。 前者是將配置檔案 或資料庫中儲存的資源(url)提取出來加工成為url和許可權列表的Map供Security使用,後者提取使用者名稱和許可權組成一個完整的(UserDetails)User 物件,該物件可以提供使用者的詳細資訊供AuthentationManager進行認證與授權使用。
(3)常見問題:
spring security怎麼實現對方法的許可權認證
(4)解決方案:
spring中用@PreAuthorize標註在方法上,利用spring的切面思想,在方法呼叫前先進行許可權驗證匹配,如果合適再進行方法的呼叫。
(5)編碼實戰:
簡單的進行一個spring security的簡單呼叫
(6)拓展思考:
(7)參考文獻:
http://www.tianshouzhi.com/api/tutorials/spring_security_4/262 【1】。個人部落格
https://blog.csdn.net/code__code/article/details/53885510【2】。CSDN部落格
https://blog.csdn.net/chenyao1994/article/details/80736369【3】。CSDN部落格
(8)更多討論:
Q1:spring security的許可權錯誤頁面時怎麼定義的?-------來自師弟討論問題
A1:spring的配置檔案類WebSecurityConfigurerAdapter中的configue方法,通過繼承並重寫方法,可以自定義錯誤頁面,或者到錯誤處理的controller類進行自定義;具體的方法是使用HttpSecurity.failureForwardUrl("/error")指定錯誤頁面,不指定預設為spring boot的error頁面。
Q2:spring security的userDetailService的作用?-------來自師弟討論問題
A2:spring security中的userDetailService類是一個介面,方法直有一個,loadUserByUsername,作用就是從指定的資料來源載入使用者資訊到spring的authenticationManager中去,當用戶輸入使用者名稱和密碼以後,這個作為驗證的依據。資料來源可以是資料庫,或者是硬編碼的程式碼,而且spring security直有一個載入資訊的途徑,所有的載入資料,必須實現這個介面。
Q3:spring security和shiro怎麼選擇?
A3:除了不能脫離Spring,shiro的功能security都有。而且Spring Security對Oauth、OpenID也有支援,Shiro則需要自己手動實現。Spring Security的許可權細粒度更高;但是spring security的學習成本高,配置起來較security複雜一些,spring security的擴充套件性比較好,如果後期迭代比較多,可以考慮選擇security作為基礎。
(9)鳴謝:
(10)結束語:
今天的分享就到這裡啦,歡迎大家點贊、轉發、留言、拍磚~
更多內容,可以加入IT交流群565734203與大家一起討論交流
這裡是技能樹·IT修真院:http://www.jsnhu.com,初學者轉行到網際網路的聚集地