比较Spring Security6.X 和 Spring Security 5.X的不同
项目使用了SpringBoot3 ,因此 SpringSecurity也相应进行了升级 版本由5.4.5升级到了6.1.5 写法上发生了很大的变化,最显著的变化之一就是对 WebSecurityConfigurerAdapter 类的使用方式的改变。这个类在 Spring Security 中被广泛用于自定义安全配置。以下是主要的差异和写法上的变化:
废弃
WebSecurityConfigurerAdapter:- 在 Spring Security 5.x 版本中,
WebSecurityConfigurerAdapter是实现安全配置的常用方法。用户通过继承这个类,并覆盖其方法来自定义安全配置。 - 到了 Spring Security 6.x,
WebSecurityConfigurerAdapter被标记为过时(deprecated),意味着它可能在未来的版本中被移除。这一变化是为了推动使用更现代的配置方法,即使用组件式配置。
- 在 Spring Security 5.x 版本中,
使用组件式配置:
- 在 Spring Security 6.x 中,推荐使用组件式配置。这意味着你可以创建一个配置类,该类不再需要继承
WebSecurityConfigurerAdapter。 - 你可以直接定义一个或多个
SecurityFilterChainbean 来配置安全规则。这种方式更加灵活,并且与 Spring Framework 的整体风格更加一致。
- 在 Spring Security 6.x 中,推荐使用组件式配置。这意味着你可以创建一个配置类,该类不再需要继承
示例代码变化:
- 在 Spring Security 5.x 使用
WebSecurityConfigurerAdapter的配置框架:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
}
- 在 Spring Security 6.x 使用组件式配置变成了这个样子:
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
return http.build();
}
}
项目上具体的写法:
- 在 Spring Security 5.4.5 使用
WebSecurityConfigurerAdapter的配置:
@Configuration
@Component
@EnableWebSecurity
@AllArgsConstructor
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Value("${auth.whitelist:/login}")
private final String[] URL_WHITELIST;
private final AuthenticationFailureHandler loginFailureHandler; private final UserLoginSuccessHandler loginSuccessHandler;
private final UserLogoutSuccessHandler logoutSuccessHandler;
private final UserDetailsService userDetailsService;
private final AccessDeniedHandler authAccessDeniedHandler;
private final AuthenticationEntryPoint loginAuthenticationEntryPoint; @Bean
BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
} @Bean
public UserAuthenticationProvider myAuthenticationProvider() {
UserAuthenticationProvider userAuthenticationProvider = new UserAuthenticationProvider(userDetailsService);
return userAuthenticationProvider;
} @Bean
JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
JwtAuthenticationFilter jwtAuthenticationFilter2 = new JwtAuthenticationFilter(authenticationManager());
return jwtAuthenticationFilter2;
} @Override
protected void configure(HttpSecurity http) throws Exception { http
.cors()
.and()
.csrf().disable()
.formLogin()
.loginProcessingUrl("/login")
.usernameParameter("userName")
.passwordParameter("password")
.successHandler(loginSuccessHandler)
.failureHandler(loginFailureHandler) .and()
.logout()
.logoutSuccessHandler(logoutSuccessHandler) //禁用session
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) //配置拦截规则
.and()
.authorizeRequests()
.antMatchers(URL_WHITELIST).permitAll() .anyRequest().authenticated() //异常处理器
.and()
.exceptionHandling()
.authenticationEntryPoint(loginAuthenticationEntryPoint)
.accessDeniedHandler(authAccessDeniedHandler) .and()
.addFilterAfter(jwtAuthenticationFilter(), ExceptionTranslationFilter.class); }
}
- 使用SpringSecurity6.1.5实现相同逻辑的配置变成了如下形式:
@Configuration
@Component
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfiguration { @Value("${bxt.auth.whitelist:/login}")
private final String[] URL_WHITELIST; private final CustomerUserDetailsService customUserDetailsService;
private final CustomLoginSuccessHandler loginSuccessHandler;
private final CustomLoginFailureHandler loginFailureHandler;
private final AccessDeniedHandler authAccessDeniedHandler;
private final AuthenticationEntryPoint loginAuthenticationEntryPoint;
@Bean
BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
} @Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() {
return new JwtAuthenticationFilter(); // 实例化您的 JWT 过滤器
} @Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return new ProviderManager(new DaoAuthenticationProvider() {{
setUserDetailsService(customUserDetailsService);
setPasswordEncoder(bCryptPasswordEncoder());
}});
} @Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.authorizeRequests(authz -> authz
.requestMatchers(URL_WHITELIST).permitAll() // 允许访问无需认证的路径
.anyRequest().authenticated()
)
.formLogin(form -> form.
loginProcessingUrl("/login")
.usernameParameter("username")
.passwordParameter("password")
.successHandler(loginSuccessHandler)
.failureHandler(loginFailureHandler)
)
.logout(Customizer.withDefaults())
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.userDetailsService(customUserDetailsService)
.exceptionHandling(exceptionHandle -> exceptionHandle
.authenticationEntryPoint(loginAuthenticationEntryPoint)
.accessDeniedHandler(authAccessDeniedHandler)
)
.addFilterAfter(jwtAuthenticationFilter(), ExceptionTranslationFilter.class)
.httpBasic(Customizer.withDefaults()); return http.build();
}
}
总之,从 Spring Security 5.x 迁移到 6.x,主要的改变是从继承 WebSecurityConfigurerAdapter 转向定义 SecurityFilterChain bean 的方式来配置安全性。这种变化旨在使配置更加模块化和灵活,并更好地符合 Spring 框架的整体设计哲学。
比较Spring Security6.X 和 Spring Security 5.X的不同的更多相关文章
- Spring MVC 项目搭建 -6- spring security 使用自定义Filter实现验证扩展资源验证,使用数据库进行配置
Spring MVC 项目搭建 -6- spring security使用自定义Filter实现验证扩展url验证,使用数据库进行配置 实现的主要流程 1.创建一个Filter 继承 Abstract ...
- Spring MVC 项目搭建 -5- spring security 使用数据库进行验证
Spring MVC 项目搭建 -5- spring security 使用数据库进行验证 1.创建数据表格(这里使用的是mysql) CREATE TABLE security_role ( id ...
- Spring Boot中使用 Spring Security 构建权限系统
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全 ...
- Spring Boot整合实战Spring Security JWT权限鉴权系统
目前流行的前后端分离让Java程序员可以更加专注的做好后台业务逻辑的功能实现,提供如返回Json格式的数据接口就可以.像以前做项目的安全认证基于 session 的登录拦截,属于后端全栈式的开发的模式 ...
- 基于spring的安全管理框架-Spring Security
什么是spring security? spring security是基于spring的安全框架.它提供全面的安全性解决方案,同时在Web请求级别和调用级别确认和授权.在Spring Framewo ...
- Spring Cloud 学习 (九) Spring Security, OAuth2
Spring Security Spring Security 是 Spring Resource 社区的一个安全组件.在安全方面,有两个主要的领域,一是"认证",即你是谁:二是& ...
- Spring Boot中开启Spring Security
Spring Boot中开启Spring Security Spring Security是一款基于Spring的安全框架,主要包含认证和授权两大安全模块,和另外一款流行的安全框架Apache Shi ...
- Spring实战1:Spring初探
主要内容 Spring的使命--简化Java开发 Spring容器 Spring的整体架构 Spring的新发展 现在的Java程序员赶上了好时候.在将近20年的历史中,Java的发展历经沉浮.尽管有 ...
- Spring顶级项目以及Spring cloud组件
作为java的屌丝,基本上跟上spring屌丝的步伐,也就跟上了主流技术. spring 顶级项目: Spring IO platform:用于系统部署,是可集成的,构建现代化应用的版本平台,具体来说 ...
- Spring Boot——开发新一代Spring应用
Spring官方网站本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系.随着Spring 3.0的发布,Spring IO团队逐渐开 ...
随机推荐
- Django: Token分发
Django后台token分发 在settings.py中引入 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'd ...
- python下的jstack - pystack
背景 python 多进程任务,卡在某个地方没有继续执行也没有报出异常,进程被hang住 日志没有捕获到相关信息,需要知道进程阻塞在哪里,为什么阻塞 jvm提供了jstack.jmap类工具进行性能分 ...
- [db2]缓冲池管理
简介 缓冲池指的是从硬盘读取表和索引数据时,数据库管理器分配的用于高速缓存这些表和索引数据的内存区域.每个数据库都必须具有至少一个缓冲池,创建数据库时会自动创建一个名为IBMDEFAULTBP的缓冲池 ...
- 清理MySQL的binlog历史文件
前言 系统版本:centos 7 MySQL版本:5.7 mysql的binlog文件最好不要手动删,避免删错导致bin log同步异常. 步骤 查看当前的binlog文件 show binary l ...
- Docker Dockerfile指令大全
FROM-指定基础镜像 指定基础镜像,并且Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令. # 语法格式 FROM < ...
- Airtest的iOS实用接口介绍
1. 前言 前段时间Airtest更新了1.3.0.1版本,里面涉及非常多的iOS功能新增和改动,今天想详细跟大家聊一下里面的iOS设备接口. PS:本文示例均使用本地连接的iOS设备,Airtest ...
- 《CTFshow-Web入门》07. Web 61~70
@ 目录 web61~65 题解 web66 题解 原理 web67 题解 原理 web68 题解 原理 web69 题解 原理 web70 题解 原理 ctf - web入门 web61~65 题解 ...
- 使用 Laf 一周内上线美术狮 AI 绘画小程序
"美术狮 AI 绘画"(以下简称"美术狮"),是我们小团队的一次尝试,定位是人人都可以上手的,充满创意的,理解中文和中国文化的图片生成工具. 在完善图像模型和论 ...
- VulnStack - ATT&CK红队评估实战(四) Writeup
VulnStack - ATT&CK红队评估实战(四) Writeup VulnStack(四)环境搭建 1.项目地址 http://vulnstack.qiyuanxuetang.net/v ...
- Asp-Net-Core开发笔记:FrameworkDependent搭配docker部署
前言 之前我写过一篇使用 docker 部署 AspNetCore 应用的文章,这种方式搭配 CICD 非常方便, build 之后 push 到私有的 dockerhub ,在生产服务器上 pull ...