Springboot Web應用中基於預設配置啟用Spring Security時的效果總結
阿新 • • 發佈:2018-12-12
前提: 本文假定你已經擁有一個使用
maven
管理基於springboot
的web
專案。
基於預設配置啟用Spring Security
假定你已經有了一個基於Springboot 的Web應用,想啟用Spring Security並使用預設配置,以下是啟用步驟 :
- 專案依賴中增加依賴
spring-boot-starter-security
;
<!-- Spring Security 依賴 -->
<dependency>
<groupId>org.springframework.boot</ groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 添加註解
@EnableWebSecurity
啟用Spring Security
;
// 啟用 web security
@EnableWebSecurity <========
@SpringBootApplication
public class Application {
public static void main(String[ ] args) {
SpringApplication.run(Application.class, args);
}
}
都有哪些預設配置表現
預設情況使用的web安全配置
// 摘自預設使用的安全配置介面卡WebSecurityConfigurerAdapter#getHttp方法中HttpSecurity http
// 物件剛剛被建立之後
// 這段邏輯在預設情況下被執行並最終生效
http
.csrf().and()
.addFilter(new WebAsyncManagerIntegrationFilter())
. exceptionHandling().and()
.headers().and()
.sessionManagement().and()
.securityContext().and()
.requestCache().and()
.anonymous().and()
.servletApi().and()
.apply(new DefaultLoginPageConfigurer<>()).and()
.logout();
// 摘自預設使用的安全配置介面卡WebSecurityConfigurerAdapter#configure方法
// 該方法在上面程式碼之後立即被執行,對HttpSecurity http物件補充更多設定
// 這段邏輯在預設情況下被執行並最終生效
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin().and()
.httpBasic();
預設啟用的Spring Security Filter
名稱 |
---|
WebAsyncManagerIntegrationFilter |
SecurityContextPersistenceFilter |
HeaderWriterFilter |
CsrfFilter |
LogoutFilter |
UsernamePasswordAuthenticationFilter |
DefaultLoginPageGeneratingFilter |
DefaultLogoutPageGeneratingFilter |
BasicAuthenticationFilter |
RequestCacheAwareFilter |
SecurityContextHolderAwareRequestFilter |
AnonymousAuthenticationFilter |
SessionManagementFilter |
ExceptionTranslationFilter |
FilterSecurityInterceptor |
預設提供的認證方式
基於記憶體保持的一個使用者賬號
- 使用者名稱稱為
user
- 密碼明文會在程式啟動時顯示在控制檯上
例子 :
Using generated security password: 333166dc-91a6-4555-9adb-d632a2cb7e68
- 相應的
UserDetailsService
是一個InMemoryUserDetailsManager
例項。 - 相應的
AuthenticationManager
是一個ProviderManager
例項,它自己包含一個AuthenticationProvider
:AnonymousAuthenticationProvider
不支援使用者名稱/密碼錶單認證,但它的雙親AuthenticationManager
:ProviderManager
包含了一個AuthenticationProvider
:DaoAuthenticationProvider
使用上面的使用者名稱/密碼支援使用者名稱/密碼認證。 - 相應的密碼加密和比較器使用代理
DelegatingPasswordEncoder
,最終使用NoOpPasswordEncoder
進行明文比較。
密碼驗證方式
預設使用的URL地址
URL | 功能 |
---|---|
GET /login |
登入頁面 展示包含一個登入表單的HTML頁面, 有兩個輸入框供使用者輸入 username ,password ,一個_csrf token 隱藏欄位,和一個表單提交按鈕,表單提交地址是 POST /login 表單提交的密碼採用明文傳輸 |
POST /login |
登入請求處理地址 1.登陸自動跳轉:/ 2.登入失敗自動跳轉: /login?error |
GET /logout |
退出登入頁面 展示包含一個退出登入表單的HTML頁面, 有一個退出登入提示訊息,一個 _csrf token 隱藏欄位,和一個表單提交按鈕表單提交地址是 POST /logout |
POST /logout |
退出登入請求處理地址 1.退出登入成功自動跳轉: /login?logout |