Spring Boot —— Spring Security

试试手气發表於2024-05-22

引入依賴

Spring boot 版本 2.7.6

<properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
        <mysql.version>8.2.0</mysql.version>
        <druid.version>1.2.22</druid.version>
    </properties>
	
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
	
	<dependencies>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
	</dependencies>

Spring Security 開始工作了嗎

引入Spring Security之後,預設會保(攔)護(截)所有請求,此時使用瀏覽器訪問任意請求(地址)會發現跳轉到一個登入頁,說明 Spring Security 已經開始工作了,以 Spring Security 5.7.5 為例
image

如果我們什麼都不配置,預設的使用者名稱是user,而密碼會在啟動時輸出到控制檯Using generated security password: 8c189297-d9c5-483a-9ae2-8efb64129776

配置

自定義使用者名稱和密碼

修改配置檔案,使用自定義使用者名稱和密碼

spring:
  security:
    user:
	  name: admin
	  password: 123456

使用配置類控制 Spring Security 行為

寫一個SecurityConfig類,裡邊定義對 Spring Security 行為的控制,例如

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        http.authorizeHttpRequests((auth)->{
            try {
                auth.anyRequest().authenticated()
                        .and()
						// 使用表單登入
                        .formLogin()
                        // 登入成功跳轉地址,第二個引數控制是否忽略來源頁面始終跳轉所設定的地址
                        .defaultSuccessUrl("/authentication")
                        .and()
                        .csrf().disable();
            }catch (Exception e){
                throw new RuntimeException(e);
            }
        });

        return http.build();
    }
}

這是一個非常基礎的配置類,啟用表單登入並且使用Spring Security預設登入頁面(因為沒有設定自定義登入頁),登入成功預設跳轉/authentication。很多書上對此部分的介紹是使SecurityConfig繼承WebSecurityConfigurerAdapter,並透過重寫configure(AuthenticationManagerBuilder builder)configure(HttpSecurity http)方法達到更多控制

自定義登入頁面

如果使用自定義登入頁面,通常頁面中的使用者名稱或密碼會這樣寫

<input name="username" />
<input name="password" />

如果希望修改表示使用者名稱和密碼的關鍵字,可以透過設定HttpSecurity對應方法,同時修改input的name屬性達到目的

.formLogin()
.usernameParameter("uid")
.passwordParameter("pwd")
<input name="uid" />
<input name="pwd" />

基於記憶體的認證

模擬記憶體中新增若干使用者,這些使用者被設定使用者名稱、密碼和角色,並在登入時起作用

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	@Override
	protected void configure(AuthenticationManagerBuilder builder) throws Exception{
		builder.inMemoryAuthentication()
			.withUser("admin").password("123456").roles("ADMIN")
			.and()
			.withUser("user").password("123456").roles("USER")
	}
}

登出

預設訪問/logout會登出,和登入類似,登出也可以進行針對性設定

相關文章