Spring Security 官网
Spring Security 是针对 Spring 项目的安全框架
也是 Spring Boot 底层安全模块默认的技术选型
它可以实现强大的 Web 安全控制
只需引入 spring-boot-starter-security 模块,进行少量配置,即可实现强大的安全管理
几个重要的类:
WebSecurityConfigurerAdapter:自定义 Security 策略(从 5.7.0-M2 起已被弃用)
Spring Security:升级已弃用的 WebSecurityConfigurerAdapter - spring 中文网 (springdoc.cn)
AuthenticationManagerBuilder:自定义认证策略
@EnableWebSecurity:开启 WebSecurity 模式
Spring Security 的主要目标是认证和授权(访问控制)
认证:Authentication
授权:Authorization
概念通用,只要涉及到安全都有
pom.xml 文件导入 security 依赖
<!-- security依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Maven 导入成功
新版 Spring Security 中的路径匹配机制 - spring 中文网 (springdoc.cn)
编写过程中,antMatchers 发现没有,搜索后发现新版本已被移除(看老版本教学视频好痛苦)
使用 requestMatchers 来进行替代
config 包下创建 SecurityConfig 类:
package com.demo.security.config;
import org.springframework.context.annotation.Bean;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
//AOP横切:拦截器
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SecurityConfig {
//授权
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
//首页所有人都可以访问,功能页只有对应有权限的人才能访问
http.authorizeRequests()
.requestMatchers("/").permitAll()
.requestMatchers("/level1/**").hasRole("vip1")
.requestMatchers("/level2/**").hasRole("vip2")
.requestMatchers("/level3/**").hasRole("vip3");
//没有权限默认会到登录页面,需要开启登录页面
http.formLogin();
return http.build();
}
//认证
@Bean
public AuthenticationManager authenticate(AuthenticationManagerBuilder auth) throws Exception{
//这些数据整除应该从数据库中读取,密码需要加密处理
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("demo").password(new BCryptPasswordEncoder().encode("demo")).roles("vip2","vip3")
.and()
.withUser("admin").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
.and()
.withUser("root").password(new BCryptPasswordEncoder().encode("root")).roles("vip1");
return auth.build();
}
}