Spring Boot —— Spring Security
引入依赖
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
会注销,和登录类似,注销也可以进行针对性设置