Spring Security是一款基于Spring的安全框架扳肛,主要包含認證和授權(quán)兩大安全模塊傻挂,和另外一款流行的安全框架Apache Shiro相比,它擁有更為強大的功能挖息。Spring Security也可以輕松的自定義擴展以滿足各種需求金拒,并且對常見的Web安全攻擊提供了防護支持。如果你的Web框架選擇的是Spring套腹,那么在安全方面Spring Security會是一個不錯的選擇绪抛。
下面記錄講解下SpringBoot集成SpringSecurtiy,
SpringBoot版本2.1.6.RELEASE电禀,SpringSecurity版本:5.1.5.RELEASE
分為三個部分:
1. 開啟SpringSecurity
2. 基于HttpBasic認證
3. 基本原理
開啟SpringSecurity
創(chuàng)建一個Spring Boot項目睦疫,然后引入spring-boot-starter-security:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
創(chuàng)建一個對外的服務(wù):
@RestController
public class DemoController {
@GetMapping("/hello")
public String hello() {
return "Hello SpringSecurity!";
}
}
application.properties 中修改端口號為9090
server.port=9090
啟動項目,訪問http://127.0.0.1:9090/hello
當Spring項目中引入了Spring Security依賴的時候鞭呕,項目會默認開啟如下配置:
security.basic.enabled=true
這個配置開啟了一個表單認證蛤育,所有服務(wù)的訪問都必須先過這個認證,默認的用戶名為user葫松,密碼由Sping Security自動生成瓦糕,回到IDE的控制臺,可以找到密碼信息:
Using generated security password: 078db2a5-ae07-4a10-a85c-cf0162a7e966
輸入用戶名user腋么,密碼078db2a5-ae07-4a10-a85c-cf0162a7e966后咕娄,我們便可以成功訪問/hello接口珊擂。
基于HttpBasic認證
配置SpringSecurity認證方式圣勒。
創(chuàng)建一個配置類SpringSecurityConfig繼承org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter這個抽象類并重寫configure(HttpSecurity http)方法费变。
WebSecurityConfigurerAdapter是由Spring Security提供的Web應(yīng)用安全配置的適配器:
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic() // HttpBasic
// http.formLogin() // 表單方式
.and()
.authorizeRequests() // 授權(quán)配置
.anyRequest() // 所有請求
.authenticated(); // 都需要認證
}
}
重啟項目,再次訪問:http://127.0.0.1:9090/hello
基本原理
上面我們開啟了一個最簡單的Spring Security安全配置矮慕,下面我們來了解下Spring Security的基本原理夏跷。通過上面的的配置槽华,代碼的執(zhí)行過程可以簡化為下圖表示:
如上圖所示义辕,Spring Security包含了眾多的過濾器,這些過濾器形成了一條鏈撩幽,所有請求都必須通過這些過濾器后才能成功訪問到資源拜英。
其中UsernamePasswordAuthenticationFilter過濾器用于處理基于表單方式的登錄認證嫁佳,
而BasicAuthenticationFilter用于處理基于HTTP Basic方式的登錄驗證湿弦,后面還可能包含一系列別的過濾器(可以通過相應(yīng)配置開啟)瓤漏。
在過濾器鏈的末尾是一個名為FilterSecurityInterceptor的攔截器,用于判斷當前請求身份認證是否成功颊埃,是否有相應(yīng)的權(quán)限蔬充,當身份認證失敗或者權(quán)限不足的時候便會拋出相應(yīng)的異常班利。
ExceptionTranslateFilter捕獲并處理罗标,所以我們在ExceptionTranslateFilter過濾器用于處理了FilterSecurityInterceptor拋出的異常并進行處理皿哨,比如需要身份認證時將請求重定向到相應(yīng)的認證頁面,當認證失敗或者權(quán)限不足時返回相應(yīng)的提示信息不见。
源碼地址:https://github.com/lbshold/springboot/tree/master/Start-Spring-Security