哈喽各位同學們大家好呀,提前祝同學們端午節快樂🎇!今天小編為大家分享開發者學院中課程“Spring Boot2.5安全機制與 REST API身份驗證明戰 ”幹貨總結哦~Spring Boot 2.5.x開發實戰可是Java中級工程師必備課程!
課程連結以及圖譜位址小編已經為大家指路了,搭配學習效果更佳👇
課程名稱:Spring Boot 2.5.x開發實戰
課程位址:
https://developer.aliyun.com/learning/course/71?spm=a2c6h.21254954.0.0.4e905907uoWZzr圖譜名稱:Alibaba Java 技術圖譜
圖譜位址:
https://developer.aliyun.com/graph/java?spm=a2c6h.21110250.J_5703890090.6.700e3c67EjOBeJSpring Boot2.5安全機制與 REST API身份驗證明戰
一、Java Spring Boot 2.5安全機制
本節課講的是應用程式安全問題,在Spring Boot體系裡,提供了一套安全機制,可以對接各種不同的安全架構,包括自定義實作原始的身份驗證機制。
模拟簡單的REST API項目,啟用身份驗證,進行擴充對接MySQL資料庫,甚至對接Release緩存,實作整個使用者的注冊和身份驗證過程。
但大型項目,比如淘寶、微信、新浪微網誌的賬号驗證基本上都在Release裡面進行,使用者的規模比較大,而且整個的使用者會話資訊,要在分布式緩存裡面進行儲存。後面可以擴充到Release身份驗證機制,把身份驗證與Release和MySQL結合起來,實作一個完整的項目。
(一)Java Spring Boot 2.0安全機制
Spring Boot提供的安全機制,可以用Spring Security 開源架構,也可以用Apache Shiro 開源架構,還可以用自定義實作安全驗證。Web架構開發底層本質上是Web請求進入Web架構,然後可以攔截,這裡也叫AOP程式設計,用于做攔截,做身份驗證的工作。總結:
1. 自定義實作安全驗證;
2. Apache Shiro 開源架構;
3. Spring Security 開源架構;
4. 大量使用AOP;
5. 依賴注入思想;
6. 靈活擴充。

(二)Java Spring Boot 2.5安全機制
也可以進行授權,定了一些角色,設定對應的權限,這裡支援的方式很多。Spring Boot作為快速開發架構,底層有Web開發的接口,可以做網站、 API應用、定時任務應用等等。
目前應用程式身份驗證的類型非常多,不僅基于網頁的Form表單驗證、Basic、摘要身份驗證、令牌身份驗證,令牌身份驗證主要是用在REST API,包括一些大型的微服務架構程式中。當然還有企業級身份驗證,比如基于企業區域網路的客戶身份驗證,組織内部使用的身份驗證。還有跨第三方平台的開放式身份驗證體系等。
(三)安全漏洞
後續基于Spring Boot進行開發,盡量更新到比較新的版本,最好是Spring Boot2.3以上的版本,不要用太老的版本。Spring Boot 2020年9月份又修複了一批安全漏洞,涉及到遠端代碼過程執行的安全漏洞問題。
安全漏洞建議總結:
1. Spring Boot 2020年9月份修複漏洞;
2. Spring Boot Actuator 未授權通路遠端代碼執行漏洞;
3. 緊急修複 Spring Framework 版本包含一個安全漏洞(CVE-2020-5421)的修複程式。此漏洞可以通過 sessionId 繞過RFD (反射型檔案下載下傳)保護;
4. Spring Boot 2018年修複了一些安全漏洞;
5. 建議使用最新的Spring 5.0+版本;
6. Spring 架構更新 5.0.0 - 5.0.2;
7. Spring 架構更新 4.3.0 - 4.3.13;
8. Spring Boot 1.5.10。
(四)Java Spring Security
安全架構本身相對成熟,可以內建Spring Security,也可以內建Spring MVC,也可以內建Spring Boot,也可以內建Spring cloud。
保護Spring應用系統的安全标準,可以實施各種産同的身份驗證,可以做各種資料源進行內建,定制開發工作,包括基于角色、基于令牌都可以實作。這種多種身份驗證機制的支援,包括擴充URL、自定義路由規則,這種方法的驗證都可以進行實作。這種架構友善建構安全體系,不會限制應用程式的類型。整個內建和Spring應用平台內建的最好。總結:
1. Spring Security功能強大且高度可自定義的安全架構;
2. 保護Spring應用系統的安全标準;
3. Spring Security專注于身份驗證和授權;
4. 容易地擴充、自定義開發;
5. 前身是Acegi Security;
6. 提供安全認證服務的架構;
7. Spring Security為基于J2EE企業應用提供了全面安全機制;
8. Authentication驗證和Authorization授權;
9. 抵禦會話攻擊, 點選劫持,CSRF跨站請求僞造。
(五)Java安全架構Shiro
Apache 官網有一個開源的項目叫Apache Shiro,是一個開源的安全管理,支援的工作非常強大,唯一的差别是不屬于Spring官方。但是很好用,有很多項目包括Spring Boot,甚至Spring Cloud都在使用Apache Shiro。對接不同的資料源,兩個都可以,取決于個人傾向,兩個都非常完善,正常情況下,如果希望技術上簡單一點,可以直接使用一整套Spring。Java安全架構Shiro總結:
1. Apache Shiro簡單易用的開源Java安全架構;
2. 輕松實作身份驗證、授權、加密和會話管理;
3. 使用Shiro可以快速實作系統安全;
4. Shiro其前身是Jsecurity項目;
5. Shiro可以輕易實作Java網站安全驗證;
6. 可應用于Web環境,非Web環境;
7. 支援多種資料源MySQL等;
8. 如LDAP,JDBC,Kerberos,ActiveDirectory等)。
二、Java Spring Boot 2.5安全實戰
(一)Spring Security Demo
在之前的WEB架構基本上,可以加入門的starter-security的依賴,入完以後,會提供必要的安全元件,預設的就是security元件,當然也可以替換,兩個都可以配置。實作代碼如下:
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId> spring-boot-starter-security </artifactId>
</dependency>
</dependencies>
(二)WebSecurityConfig
早期的Spring1.x幾版本中,需要自己顯示去關閉或者開放安全驗證,現在的基本上預設是已經啟動了。可以直接設定WebSecurityConfig配置檔案,注入必要的安全配置規則,比如基于某個内路由規則、針對order訂單的身份驗證等,甚至加入角色的限制都可以實作,提供了強大的規則。
WebSecurityConfig總結:
1. Spring Security的配置類;
2. WebSecurityConfig;
3. 可以配置安全規則;
4. 預設啟用basic驗證;
5. # Spring Security可以在配置檔案中關閉;
6. security.basic.enabled = false。
(三)Web全站安全驗證配置
下面這段代碼,是Web全站安全驗證配置的例子,針對anyRequest定制時,所有的請求都做身份驗證。hasRole表示針對目前的請求通路某個位址,或者所有的請求通路時是否具備某個角色。當然這個角色或者權限的驗證,需要定制擴充接口就可以了。比如連資料庫或者連緩存,實作角色查詢,有校驗就可以了。
@ Configuration
@ (SecurityProperties.BASIC_AUTH_ORDER - 10)
public class ApplicationConfigurerAdapter extends
WebSecurityConfiguerAdapter{
@Override
protected void configure( http) throws
{
http.antMatcher("/admin/**")
.authorizeRequests()
.antMatchers("/admin/users").hasRole(“usersAdmin")
.antMatchers("/admin/orders").hasRole(“ordersAdmin")
.anyRequest().isAuthenticated();
}
(四)重新實作驗證機制
當然有一般規則,就有特殊規則,允許自定義擴充底層的API實作自定義的判斷邏輯,這是良好的安全架構所具備的功能。重新實作驗證機制:
• WebSecurityConfig安全配置類;
• UserDetailsService 接口。
實踐案例示範:
這個程式是之前的Web網站,看一下項目的依賴,通過檔案依賴可以看出,相比之前的項目,資料庫依然存在,還是用之前的spring data jpa,加入MySQL的資料庫的連結。
後面稍微注意一下,這裡面有個starter security,加完以後,可以看一下左邊的依賴包的安全元件,有包括spring security config 、spring security core、spring security web等。
下面看一下,代碼具體的配置和實作,新版本預設已經內建,現在最主要的要有Web安全配置,全局配置的時候使用記憶體驗證,實際可以對接資料庫、對接緩存。目前程式的程序裡面寫了使用者名“frankxu”,密碼“1234qwer”,這種方式并不提倡。
正常情況下,可以定義特殊規則“configuer”,針對rize請求,可以比對首頁,允許首頁所有的人都可以通路;針對user,做身份驗證。也可以提供表單的登入模式“formLogin()”。做這個例子,是提供這種通路HOME可以不做身份驗證的方法,可以直接進入。
查詢資料庫Get all,示範在浏覽器輸入“localhost:8081”,啟動網址,會發現一個問題,通路一個接口時,比如user檢視所有使用者,會自動跳轉到“login”。當請求一個位址的時候,發現不是可忽略的位址,會自動攔截,跳轉到登入界面,這個登入界面是基于表單。
這時會要求輸入使用者賬号和密碼,使用者賬号和密碼是定義死的。
為我之已經測試過了,點選登入,“Users/gerAll”就可以通路了,
如上圖所示,出現了3個賬号和密碼,這3個賬号全部傳回出來了。當然這裡還有别的接口,“GetById”
測試一下,輸入“GetById/1”,傳回ID為1的賬号和密碼:
(五)Java面試題
1.本質:URL,攔截請求,驗證,放行或者拒絕
注意規則的順序,正常的項目,會有一個通路,并且有攔截請求操作,安全機制本質上是攔截請求,基于URL規則,判斷請求是不是要攔截,驗證,然後放行或者拒絕。驗證過程,可以調用緩存或資料庫實作安全驗證規則。
其他的Java面試題這節課就不一一說明了,留給大家課後思考。
2. Java Spring Security安全機制;
3. 如何擴充使用Token令牌驗證;
4. JWT開源安全令牌元件;
5. 如何支援X509正式驗證;
6. 自定義實作Spring Boot 2.5.x身份驗證;
7. API安全如何實作;
8. SSO單點登入怎麼實作?
9. 微服務Spring Cloud安全體系;
10. 轉Java,跳槽一線網際網路公司。