HttpBasic 認(rèn)證模式活該被放棄
今天來聊一聊spring security中的一種經(jīng)典認(rèn)證模式HttpBasic,在5.x版本之前作為Spring Security默認(rèn)認(rèn)證模式,但是在5.x版本中被放棄了,默認(rèn)的是form login認(rèn)證模式
HttpBasic模式的應(yīng)用場景
HttpBasic登錄驗證模式是Spring Security實現(xiàn)登錄驗證最簡單的一種方式,也可以說是最簡陋的一種方式。
為什么是最簡陋的?這種模式用來糊弄普通用戶可以,但是稍微懂點技術(shù)的用戶分分鐘就可以將其破解,因為底層并未做任何的安全的設(shè)置,僅僅是將用戶名:密碼做了簡單的base64加密傳遞給服務(wù)端,base64又是一種可逆的算法。
因此 HttpBasic 的應(yīng)用場景非常少,對于不重要的數(shù)據(jù),用戶比較少但是又想設(shè)置一重障礙的時候就可以考慮使用這種
整合Spring Security 搞一把
雖然這種認(rèn)證模式不太重要,但是還是要了解,對于后面的學(xué)習(xí)至關(guān)重要,下面搭建一個項目演示一下
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版本,默認(rèn)的認(rèn)證方式是form表單認(rèn)證,因此需要配置一下HttpBasic認(rèn)證模式,代碼如下:
/**
* @author 公眾號:碼猿技術(shù)專欄
* @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認(rèn)證
.and()
.authorizeRequests()
.anyRequest()
.authenticated();//所有請求都需要登錄認(rèn)證才能訪問
}
}
啟動項目,在項目后臺有這樣的一串日志打印,冒號后面的就是默認(rèn)密碼。
Using generated security password: 00af0f93-7103-4c8a-87a4-23a050a4285c
我們可以通過瀏覽器進(jìn)行登錄驗證,默認(rèn)的用戶名是user.(下面的登錄框不是我們開發(fā)的,是HttpBasic模式自帶的)
當(dāng)然我們也可以通過application.yml指定配置用戶名密碼,配置如下:
spring:
security:
user:
name: admin
password: admin
HttpBasic的原理
整個流程如下圖:
- 首先,HttpBasic模式要求傳輸?shù)挠脩裘艽a使用Base64模式進(jìn)行加密。如果用戶名是admin? ,密碼是admin,則將字符串a(chǎn)dmin:admin使用Base64編碼算法加密。加密結(jié)果可能是:YWtaW46YWRtaW4=。
- 然后,在Http請求中使用Authorization作為一個Header,Basic YWtaW46YWRtaW4=作為Header的值,發(fā)送給服務(wù)端。(注意這里使用Basic+空格+加密串)
- 服務(wù)器在收到這樣的請求時,到達(dá)BasicAuthenticationFilter過濾器,將提取“ Authorization”的Header值,并使用用于驗證用戶身份的相同算法Base64進(jìn)行解碼。
- 解碼結(jié)果與登錄驗證的用戶名密碼匹配,匹配成功則可以繼續(xù)過濾器后續(xù)的訪問。
所以,HttpBasic模式真的是非常簡單又簡陋的驗證模式,Base64的加密算法是可逆的,你知道上面的原理,分分鐘就破解掉。我們完全可以使用PostMan工具,發(fā)送Http請求進(jìn)行登錄驗證。
整個流程都在BasicAuthenticationFilter#doFilterInternal()這個方法中,有興趣的可以去看看。