Spring Security提供了三個核心的功能:java
認證(你是誰)spring
受權(你能幹什麼)瀏覽器
攻擊防禦(防止僞造身份)app
在前面的開發中,都是將spring security功能禁用的,如今開啓該功能,即在application.properties文件中把下面這句話註釋掉便可。ide
# security.basic.enabled=false # 注:在添加了BrowserSecurityConfig以後,security.basic.enabled這個配置就無論用了
重啓應用會在控制檯輸出一個默認密碼,對應的用戶名是user3d
再訪問http://localhost:8080/user/1時會提示輸入用戶名密碼,默認狀況下是httpBasic認證.code
認證受權相關的代碼寫在各個模塊裏,處理瀏覽器相關的代碼寫在imooc-security-browser模塊裏。寫在imooc-security-browser模塊裏的配置能在demo模塊裏起做用,緣由是demo中的起動類在com.imooc包下,而BrowserSecurityConfig在com.imooc.security.browser.config包下,注意啓動類和配置類所在的包,要否則配置類會不起做用的orm
httpBasic登陸,在imooc-security-browser模塊裏添加以下配置類,實現了自定義的httpBasic登陸,即默認的認證模式:blog
@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對應的控制器