一、HttpBasic模式的應用場景
HttpBasic登入驗證模式是Spring Security實現登入驗證最簡單的一種方式,也可以說是最簡陋的一種方式。它的目的並不是保障登入驗證的絕對安全,而是提供一種“防君子不防小人”的登入驗證。
就好像是我小時候寫日記,都買一個帶小鎖頭的日記本,實際上這個小鎖頭有什麼用呢?如果真正想看的人用一根釘子都能撬開。它的作用就是:某天你的父母想偷看你的日記,拿出來一看還帶把鎖,那就算了吧,怪麻煩的。
舉一個我使用HttpBasic模式的進行登入驗證的例子:我曾經在一個公司擔任部門經理期間,開發了一套用於統計效率、分享知識、生成程式碼、匯出報表的Http介面。純粹是為了工作中提高效率,同時我又有一點點小私心,畢竟各部之間是有競爭的,所以我給這套介面加上了HttpBasic驗證。公司裡隨便一個技術人員,最多隻要給上一兩個小時,就可以把這個驗證破解了。說白了,這個工具的資料不那麼重要,加一道鎖的目的就是不讓它成為公開資料。如果有心人破解了,真想看看這裡面的資料,其實也無妨。這就是HttpBasic模式的典型應用場景。
二、spring boot2.0整合Spring security
spring boot 2,x版本maven方式引入Spring security座標。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
三、HttpBasic登入認證模式
如果使用的Spring Boot版本為1.X版本,依賴的Security 4.X版本,那麼就無需任何配置,啟動專案訪問則會彈出預設的httpbasic認證.
我們現在使用的是spring boot2.0版本(依賴Security 5.X版本),HttpBasic不再是預設的驗證模式,在spring security 5.x預設的驗證模式已經是表單模式。所以我們要使用Basic模式,需要自己調整一下。並且security.basic.enabled
已經過時了,所以我們需要自己去編碼實現。
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic()//開啟httpbasic認證
.and()
.authorizeRequests()
.anyRequest()
.authenticated();//所有請求都需要登入認證才能訪問
}
}
啟動專案,在專案後臺有這樣的一串日誌列印,冒號後面的就是預設密碼。
Using generated security password: 0cc59a43-c2e7-4c21-a38c-0df8d1a6d624
我們可以通過瀏覽器進行登入驗證,預設的使用者名稱是user.(下面的登入框不是我們開發的,是HttpBasic模式自帶的)
當然我們也可以通過application.yml指定配置使用者名稱密碼
spring:
security:
user:
name: admin
password: admin
四、HttpBasic模式的原理說明
- 首先,HttpBasic模式要求傳輸的使用者名稱密碼使用Base64模式進行加密。如果使用者名稱是
"admin"
,密碼是“ admin”,則將字串"admin:admin"
使用Base64編碼演算法加密。加密結果可能是:YWtaW46YWRtaW4=。 - 然後,在Http請求中使用Authorization作為一個Header,“Basic YWtaW46YWRtaW4=“作為Header的值,傳送給服務端。(注意這裡使用Basic+空格+加密串)
- 伺服器在收到這樣的請求時,到達BasicAuthenticationFilter過濾器,將提取“ Authorization”的Header值,並使用用於驗證使用者身份的相同演算法Base64進行解碼。
- 解碼結果與登入驗證的使用者名稱密碼匹配,匹配成功則可以繼續過濾器後續的訪問。
所以,HttpBasic模式真的是非常簡單又簡陋的驗證模式,Base64的加密演算法是可逆的,你知道上面的原理,分分鐘就破解掉。我們完全可以使用PostMan工具,傳送Http請求進行登入驗證。
期待您的關注
- 博主最近新寫了一本書:《手摸手教您學習SpringBoot系列-16章97節》
- 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格。