引入依賴
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 為例
如果我們什麼都不配置,預設的使用者名稱是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
會登出,和登入類似,登出也可以進行針對性設定