第七章 :Spring Boot 安全管理
1 Spring Security介绍
针对项⽬的安全管理,Spring家族提供了安全框架Spring Security,它是⼀个基于Spring⽣态圈的,⽤于提供安全 访问控制解决⽅案的框架。为了⽅便Spring Boot项⽬的安全管理,Spring Boot对Spring Security安全框架进⾏了 整合⽀持,并提供了通⽤的⾃动化配置,从⽽实现了Spring Security安全框架中包含的多数安全管理功能,下⾯针 对常⻅的安全管理功能进⾏介绍,具体如下。
1.MVC Security是Spring Boot整合Spring MVC搭建Web应⽤的安全管理框架,也是开发中使⽤最多的⼀款安全功 能。
2.WebFlux Security是Spring Boot整合Spring WebFlux搭建Web应⽤的安全管理。虽然Spring 3.WebFlux框架刚出 现不久、⽂档不够健全,但是它集成了其他安全功能的优点,后续有可能在Web开发中越来越流⾏。
4.OAuth2是⼤型项⽬的安全管理框架,可以实现第三⽅认证、单点登录等功能,但是⽬前Spring Boot版本还不⽀ 持OAuth2安全管理框架。
5.Actuator Security⽤于对项⽬的⼀些运⾏环境提供安全监控,例如Health健康信息、Info运⾏信息等,它主要作 为系统指标供运维⼈员查看管理系统的运⾏情况。
上⾯介绍了Spring Boot整合Spring Security安全框架可以实现的⼀些安全管理功能。项⽬安全管理是⼀个很⼤的 话题,开发者可以根据实际项⽬需求,选择性地使⽤Spring Security安全框架中的功能。
2 Spring Security快速⼊⻔
Spring Security的安全管理有两个重要概念,分别是Authentication(认证)和Authorization(授权)。其中,认 证即确认⽤户是否登录,并对⽤户登录进⾏管控;授权即确定⽤户所拥有的功能权限,并对⽤户权限进⾏管控。
2.1开启安全管理效果测试
在Spring Boot项⽬中开启Spring Security只需要引⼊spring-boot-starter-security启动器即可。下⾯我们在项⽬中 引⼊安全管理依赖,开启项⽬的安全管理并进⾏测试。
2.1.1 添加security启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
3 自定义用户验证
3.1内存身份验证
3.1.1自定义WebSecurityConfigurerAdapter配置类
创建⼀个配置类SecurityConfig。
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
@EnableWebSecurity注解是⼀个组合注解,其效果等同于@Import、@EnableGlobalAuthentication、@Configuration的组合⽤法,关于这些注解的介绍具体如下:
@Configuration注解的作⽤是将当前⾃定义的SecurityConfig类作为Spring Boot的配置类。
@lmport注解的作⽤是根据pom.xml中导⼊的Web模块和Security模块进⾏⾃动化配置。
@EnableGlobalAuthentication注解则⽤于开启⾃定义的全局认证。
需要说明的是,如果是针对Spring WebFlux框架的安全⽀持,需要在项⽬中导⼊Reactive Web模块和Security模 块,并使⽤@EnableWebFluxSecurity注解开启基于WebFluxSecurity的安全⽀持。
3.1.2使用内存进行身份验证
在⾃定义的SecurityConfig类中重写configure(AuthenticationManagerBuilder auth)⽅法,并在该⽅法中使⽤内 存身份认证的⽅式进⾏⾃定义⽤户认证。
package com.lzzy.Security.config;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
auth.inMemoryAuthentication().passwordEncoder(encoder)
.withUser("shitou").password(encoder.encode("123456")).roles("common")
.and()
.withUser("李四").password(encoder.encode("123456")).roles("vip");
}
}
在configure(AuthenticationManagerBuilder auth)⽅法中使⽤内存身份认证的⽅式⾃定义了认证⽤户信息。定义⽤户认证信息时,设置了两个⽤户,包括⽤户名、密码和⻆⾊。需要注意以下⼏个问题。
在进行自定义用户认证时,需要注意以下几个问题。
从Spring Security 5开始,⾃定义⽤户认证必须设置密码编码器⽤于保护密码,否则控制台会出现 “IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"”异常错误。
Spring Security提供了多种密码编码器,包括BCryptPasswordEncoder、Pbkdf2PasswordEncoder、 ScryptPasswordEncoder等。
⾃定义⽤户认证时,可以定义⽤户⻆⾊roles,也可以定义⽤户权限authorities。在进⾏赋值时,权限通常是在 ⻆⾊值的基础上添加 ROLE_ 前缀。例如, roles("common") 和 authorities("ROLE_common") 是等效的。
⾃定义⽤户认证时,可以为某个⽤户⼀次指定多个⻆⾊或权限,例如, roles("common", "vip") 或 authorities("ROLE_common", "ROLE_vip") 。
3.1.3效果测试
重启项⽬进⾏效果测试,项⽬启动成功后,仔细查看控制台打印信息,发现没有默认安全管理时随机⽣ 成的密码了。
1.执⾏http://localhost:8080访问项⽬⾸⻚时,同样⾃动跳转到了⽤户登录⻚⾯http://localhost:8080/login。如果 输⼊的⽤户名或者密码错误,会出现相应的错误提示。
2.如果输⼊的⽤户名和密码正确,那么会跳转进⼊⽹站⾸⻚。
实际开发中,⽤户都是在⻚⾯注册和登录时进⾏认证管理的,⽽⾮在程序内部使⽤内存管理的⽅式⼿动控制注册⽤ 户,所以上述使⽤内存身份认证的⽅式⽆法⽤于实际⽣产,只可以作为初学者的测试使⽤。