HttpBasic 認證模式活該被放棄
今天來聊一聊spring security中的一種經典認證模式HttpBasic,在5.x版本之前作為Spring Security預設認證模式,但是在5.x版本中被放棄了,預設的是form login認證模式
HttpBasic模式的應用場景
HttpBasic登入驗證模式是Spring Security實現登入驗證最簡單的一種方式,也可以說是最簡陋的一種方式。
為什麼是最簡陋的?這種模式用來糊弄普通使用者可以,但是稍微懂點技術的使用者分分鐘就可以將其破解,因為底層並未做任何的安全的設定,僅僅是將使用者名稱:密碼做了簡單的base64加密傳遞給服務端,base64又是一種可逆的演算法。
因此 HttpBasic 的應用場景非常少,對於不重要的資料,使用者比較少但是又想設定一重障礙的時候就可以考慮使用這種
整合Spring Security 搞一把
雖然這種認證模式不太重要,但是還是要了解,對於後面的學習至關重要,下面搭建一個專案演示一下
1. 新增maven依賴
直接新增Spring Security的依賴,如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
2. Spring Security 新增配置
由於陳某使用的是Spring Boot 2.x版本,此時的Spring Security 是5.x版本,預設的認證方式是form表單認證,因此需要配置一下HttpBasic認證模式,程式碼如下:
/** * @author 公眾號:碼猿技術專欄 * @url: www.java-family.cn * @description Spring Security的配置類 */ @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: 00af0f93-7103-4c8a-87a4-23a050a4285c
我們可以通過瀏覽器進行登入驗證,預設的使用者名稱是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請求進行登入驗證。
整個流程都在BasicAuthenticationFilter#doFilterInternal()這個方法中,有興趣的可以去看看。
- 一文給你搞定Elasticsearch技術掃盲
- Go程式語言的真正優點是什麼?
- 用Python爬了我的微信好友,他們是這樣的...
- 位元組面試也會問SPI機制?
- Volatile關鍵字能保證原子性麼?
- 種草 Vue3 中幾個好玩的外掛和配置
- Vue 狀態管理未來樣子
- 一門語言的作用域和函式呼叫是如何實現的
- 關於多執行緒同步的一切:偽共享
- Swift 與 Go:蘋果與谷歌的較量
- Android 自定義View - 柱狀波形圖 wave view
- Android技術分享|【Android踩坑】懷疑人生,主執行緒修改UI也會崩潰?
- 安卓TV外掛化9.0內聯崩潰原因及解決方案
- 測試員進階技能:如何有效地利用單元測試報告?
- Tekton 實戰完整示例
- 位元組的前端監控 SDK 是怎樣設計的
- 用Python繪製了若干張詞雲圖,驚豔了所有人
- 馬化騰:為什麼你們不在乎QQ等級,不用QQ了嗎?
- 幾個友好Java程式碼習慣建議
- Python 實現單例模式的五種寫法