针对项目的安全管理,Spring家族提供了安全框架Spring Security,它是一个基于Spring生态圈的,用于提供安全访问控制解决问题的框架。
常见的安全管理功能如下:
1.MVC Security是Spring Boot整合Spring MVC搭建Web应用的安全管理框架
2.WebFlux Security是Spring Boot整合Spring WebFlux搭建Web应用的安全管理,继承了其他安全功能优点,有可能越来越流行
3.OAuth2是大型项目的安全管理框架,可实现第三方认证、单点登录等功能,目前SpringBoot版文还不支持该框架
4.Actuator Security用于对项目的一些运行环境提供安全监控。
Spring Security使用体验
- Spring Security的安全管理有两个重要概念,分别是Authentication(认证)和Authorization(授权)。
- 认证即确认用户是否登录,并对用户登陆进行管控
- 授权即确定用户所拥有的的功能权限,并对用户权限进行管控
基础环境搭建
- 整合MCV Security安全管理功能,实现Authentication(认证)和Authorization(授权)功能
- 文件置于templates文件夹下:有需要静态资源的朋友可以评论我发你(太多了就不放在这儿了)
- 编写Web控制类
@Controller
public class FileController {
// 影片详情映射
@GetMapping("/detail/{type}/{path}")
public String toDetail(@PathVariable("type")String type,
@PathVariable("path")String path){
return "detail/" + type+ "/" + path;
}
}
至此准备工作结束,我们实现了一个传统的Web项目,有跳转等。
开启安全管理效果测试
- 添加依赖启动器
# 一旦项目引入该依赖启动器,MVC Securityhe和WebFlux Security负责的安全功能会立即生效(后者生效的前提是项目为WebFlux Web项目)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 项目启动测试
-
项目启动时会在控制台自动生成一个安全密码(security password,该密码每次启动项目都是随机生成的)
-
启动后,Spring Security会自带一个默认的登录页面,帐号为user,密码为生成的passord
-
尽管有登陆认证,但是这种默认安全管理方式存在诸多问题。(唯一默认登录用户user、密码随机生成过于暴露、登录页面不精美等)
-
MVC Security安全配置介绍
- MVC Security安全管理功能的默认安全配置是在SecurityAutoConfiguration和UserDetailsServiceAutoConfiguration中实现的。
- SecurityAutoConfiguration会导入并自动化配置SpringBootWebSecurityConfiguration用于启动Web安全管理
- UserDetailsServiceAutoConfiguration用于配置用户身份信息
- WebSecurityConfigurerAdapter的主要方法:
- configure(AuthenticationManagerBuilder auth): 定制用户认证管理员来实现用户认证
- configure(HttpSecurity http): 定制基于HTTP请求的用户访问控制
自定义用户认证
通过自定义WebSecurityConfigurerAdapter类型的Bean组件,并重写configure(AuthenticationManagerBuilder auth)方法,可以自定义用户认证
三个常用的自定义用户认证:
1.In-Memory Authentication(内存身份认证)
2.JDBC Authentication(JDBC身份认证)
3.UserDetailsService(身份认证)
内存身份认证
- 主要用于Security安全认证体验和测试
- 自定义WebSecurityConfigurerAdapter配置类
@EnableWebSecurity //开启Security安全支持
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
// @EnableWebSecurity 为一组合注解 = @Configuration、@Import、@EnableGlobalAuthentication
- 使用内存进行身份认证
- 自定义的SecurityConfig类中重写configure(AuthenticationManagerBuilder auth)方法
@EnableWebSecurity //开启Security安全支持
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//密码需要设置编码器
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
//1.使用内存用户信息,作为测试使用
auth.inMemoryAuthentication().passwordEncoder(encoder)
.withUser("tangou"