核心功能
Spring Security提供了三個核心的功能:
認證(你是誰)
授權(你能干什么)
攻擊防護(防止偽造身份)
一個簡單例子
默認情況
在前面的開發中,都是將spring security功能禁用的,現在開啟該功能,即在application.properties文件中把下面這句話注釋掉即可。
# security.basic.enabled=false
# 注:在添加了BrowserSecurityConfig之后,security.basic.enabled這個配置就不管用了
重啟應用會在控制台輸出一個默認密碼,對應的用戶名是user
再訪問http://localhost:8080/user/1時會提示輸入用戶名密碼,默認情況下是httpBasic認證.
自定義認證模式
認證授權相關的代碼寫在各個模塊里,處理瀏覽器相關的代碼寫在imooc-security-browser模塊里。寫在imooc-security-browser模塊里的配置能在demo模塊里起作用,原因是demo中的起動類在com.imooc包下,而BrowserSecurityConfig在com.imooc.security.browser.config包下,注意啟動類和配置類所在的包,要不然配置類會不起作用的
httpBasic登錄,在imooc-security-browser模塊里添加如下配置類,實現了自定義的httpBasic登錄,即默認的認證模式:
@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
System.out.println("BrowserSecurityConfig");
http.httpBasic() // httpBasic登錄
.and()
.authorizeRequests() // 對請求做授權
.anyRequest() // 任何請求
.authenticated(); // 都需要身份認證
}
}
httpForm登錄,下面的代碼是基於表單的登錄:
@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
System.out.println("BrowserSecurityConfig");
// 寫法一:繼承父類是formLogin登錄
// super.configure(http);
// 寫法二
http.formLogin() // 表單登錄
.and()
.authorizeRequests() // 對請求做授權
.anyRequest() // 任何請求
.authenticated(); // 都需要身份認證
}
}
基本原理
最核心的東西就是過濾器鏈,綠色過濾器可控制,用來處理表單登錄,其他顏色過濾器不可控制,其中藍色用來處理異常,橙色用來作最終能否訪問的認證,REST API就是我們寫的控制器。
請求到UsernamePasswordAuthenticationFilter,會判斷是否是登錄請求,是的話是否有用戶名和密碼並認證,到FilterSecurityInterceptor時會根據配置判斷請求是否滿足要求(是否已認證或不用認證),如果不滿足就返回登錄讓用戶登錄認證信息。通過在上面幾個控制器打斷點,來分析一下:
啟動應用並訪問http://localhost:8080/user/1,首先會FilterSecurityInterceptor.java,對請求做驗證,判斷沒有認證信息后拋出異常
異常信息被ExceptionTranslationFilter.java過濾器捕獲並重定向到登錄頁面
從控制台復制密碼,並在頁面輸入登錄信息,點擊登錄按鈕
登錄請求被UsernamePasswordAuthenticationFilter.java過濾器攔截,並對用戶信息進行認證
再次被FilterSecurityInterceptor.java攔截器攔截,按F8
最終訪問/user/1對應的控制器