python 做的網(wǎng)站有哪些如何在網(wǎng)絡(luò)上推廣產(chǎn)品
一.簡介
這篇文章來學習下security的認證方式其中的HTTP基本認證。
二.Spring Security的認證方式
2.1什么是認證
認證:
就是用來判斷系統(tǒng)中是否存在某用戶,并判斷該用戶的身份是否合法的過程,解決的其實是用戶登錄的問題。認證的存在,是為了保護系統(tǒng)中的隱私數(shù)據(jù)與資源,只有合法的用戶才可以訪問系統(tǒng)中的資源。
2.2認證的方式
在Spring Security中,常見的認證方式可以分為HTTP層面和表單層面,常見的認證方式如下:
- HTTP基本認證;
- Form表單認證
- HTTP摘要認證;
這篇文章先講HTTP基本認證
三. HTTP基本認證
3.1HTTP基本認證概念
在Spring Security 4.x版本中,默認采用的登錄方式是Http基本認證,該方式會彈出一個對話框,要求用戶輸入用戶名和密碼。在每次進行基本認證請求時,都會在Authorization請求頭中利用Base64對 “用戶:密碼” 字符串進行編碼。這種方式并不安全,并不適合在Web項目中使用,但它是一些現(xiàn)代主流認證的基礎(chǔ),而且在Spring Security的OAuth中,內(nèi)部認證的默認方式就是用的Http基本認證。
3.2HTTP基本認證核心API
在基本認證時,系統(tǒng)中所涉及到的各種核心API及其執(zhí)行流程,在這篇文章中,我們先對這些有基本了解即可。
簡單的執(zhí)行流程如下:
Filter->構(gòu)造Token->AuthenticationManager->轉(zhuǎn)給Provider處理->認證處理成功后續(xù)操作或者不通過拋異常
3.3HTTP基本認證步驟(重點)
HTTP基本認證是在RFC2616標準中定義的一種認證模式,它以一種很簡單的方式與用戶進行交互。HTTP基本認證可以分為如下4個步驟:
- 客戶端首先發(fā)起一個未攜帶認證信息的請求;
- 然后服務器端返回一個401 Unauthorized的響應信息,并在WWW-Authentication頭部中說明認證形式:當進行HTTP基本認證時,WWW-Authentication會被設(shè)置為Basic realm=“被保護的頁面”;
- 接下來客戶端會收到這個401 Unauthorized響應信息,并彈出一個對話框,詢問用戶名和密碼。當用戶輸入后,客戶端會將用戶名和密碼使用冒號進行拼接并用Base64編碼,然后將其放入到請求的Authorization頭部并發(fā)送給服務器;
- 最后服務器端對客戶端發(fā)來的信息進行解碼得到用戶名和密碼,并對該信息進行校驗判斷是否正確,最終給客戶端返回響應內(nèi)容。
3.4HTTP基本認證的弊端
HTTP基本認證是一種無狀態(tài)的認證方式,與表單認證相比,HTTP基本認證是一種基于HTTP層面的認證方式,無法攜帶Session信息,也就無法實現(xiàn)Remember-Me功能。另外,用戶名和密碼在傳遞時僅做了一次簡單的Base64編碼,幾乎等同于以明文傳輸,極易被進行密碼竊聽和重放攻擊。所以在實際開發(fā)中,很少會使用這種認證方式來進行安全校驗。
接下來,就用代碼來實現(xiàn)下HTTP基本認證的功能。
四. 創(chuàng)建SpringSecurity項目
參考之前的文章,這邊不做敘述。
五.代碼實現(xiàn)
5.1創(chuàng)建SecurityConfig配置類
創(chuàng)建SecurityConfig類,繼承自WebSecurityConfigurerAdapter父類,代碼如下:
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {//1.配置基本認證方式http.authorizeRequests()//對任意請求都進行認證.anyRequest().authenticated().and()//開啟basic認證.httpBasic();}}
這段代碼中httpBasic()方法,就是用來開啟基本認證的,而且默認采用的就是基本認證!
5.2創(chuàng)建web接口
HelloController類的代碼如下:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello")public String hello() {return "德瑪西亞";}}
5.3yml配置文件
創(chuàng)建一個application.yml配置文件,配置如下:
spring:security:user:name: demaxiyapassword: 123
四.功能驗證
4.1啟動項目
接著把項目啟動起來,打開瀏覽器及調(diào)試窗口,然后訪問/hello接口,這時候就可以看到瀏覽器中彈出了一個登陸窗口,截圖如下:
提示輸入自己的用戶名和密碼,認證成功后,即可訪問自己的web接口。
五. Basic認證詳解
對上面的認證過程進行詳細的分析。
5.1Basic Authorization
此時我們在自己的瀏覽器調(diào)試窗口中,查看響應頭,可以看到WWW-Authenticate認證信息:
WWW-Authenticate:Basic realm=“Realm”,截圖如下:
5.1.1各響應信息含義如下
- WWW-Authenticate: 表示服務器告知瀏覽器進行代理認證工作。
- Basic: 表示認證類型為Basic認證。
- realm=“Realm”: 表示認證域名為Realm域。
5.1.2 realm的概念
realm=“Realm”: 指認證域名為Realm,HttpBasic默認的realm名為Realm。在未認證用戶請求不同的接口時,后臺會根據(jù)分配給該接口的域,響應不同的realm名稱,并且用不同的用戶名/密碼進行認證。所以用戶每請求一個新的Realm的url,都會彈框要求使用新的Realm的用戶名/密碼進行認證,就好比不同的角色登錄只能請求屬于該角色的url。
5.2基本認證過程
此時的響應碼為401,如下圖所示:
根據(jù)401和以上響應頭信息,瀏覽器會彈出一個對話框,要求輸入 用戶名/密碼,Basic認證會將其拼接成 “用戶名:密碼” 格式,中間是一個冒號,并利用Base64編碼成加密字符串xxx;然后在請求頭中附加 Authorization: Basic xxx 信息,發(fā)送給后臺認證;后臺需要利用Base64來進行解碼xxx,得到用戶名和密碼,再校驗 用戶名:密碼 信息。
- 如果認證錯誤,瀏覽器會保持彈框;
- 如果認證成功,瀏覽器會緩存有效的Base64編碼,在之后的請求中,瀏覽器都會在請求頭中添加該有效編碼。
以上就是HTTP基本認證的內(nèi)部執(zhí)行過程。
5.3注銷Basic認證
在成功認證之后,Basic認證會把Authorization認證信息緩存在瀏覽器中一段時間,之后每次請求接口時都會自動帶上,所以直到 用戶關(guān)閉瀏覽器才會銷毀認證信息,也就是說我們無法在服務端進行有效的注銷。
不過在請求注銷時,前端也可以手動 在請求頭配置一個錯誤的Authorization,或者在瀏覽器的命令行執(zhí)行 document.execuCommand(“ClearAuthenticationCache”)方法 來清空認證信息,但該方式對Chrome瀏覽器無效。我們在調(diào)試基本認證時,可以直接開啟無痕模式,避免很多因為緩存造成的問題。