引入依賴
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
會註銷,和登錄類似,註銷也可以進行鍼對性設置