1. 程式人生 > >Springboot Web應用中基於預設配置啟用Spring Security時的效果總結

Springboot Web應用中基於預設配置啟用Spring Security時的效果總結

前提: 本文假定你已經擁有一個使用 maven管理基於springbootweb專案。

基於預設配置啟用Spring Security

假定你已經有了一個基於Springboot 的Web應用,想啟用Spring Security並使用預設配置,以下是啟用步驟 :

  1. 專案依賴中增加依賴spring-boot-starter-security;
        <!-- Spring Security 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</
groupId
>
<artifactId>spring-boot-starter-security</artifactId> </dependency>
  1. 添加註解@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