上古掌控安全的神-零:Spring Security5.x到Spring Security6.x的迁移

news2024/11/18 9:02:59

1. 本文概述

在这里插入图片描述

之前有写过一篇关于Spring Security的文章,但那已经是相对比较旧的版本了,就目前Spring Security6.0来说,这其中出现了不少的变动和更新,很多API的使用也是有不小的变化,所以我觉得有必要再写几篇文章学习一下,是的,不是一篇,是几篇,下面是初步的写作计划。

  • 《上古掌控安全的神-壹:Spring Security6.0+版本初探》
  • 《上古掌控安全的神-贰:Spring Security6.0+版本再探》
  • 《上古掌控安全的神-叁:Spring Security6.0+版本认证实践》
  • 《上古掌控安全的神-拾:Spring Security6.0+版本授权实践》
  • 《上古掌控安全的神-伍:Spring Security6.0+版本原理解析》

2. 阅读的基本前提

这里写什么呢?SpringSecurity6.0+版本都更新了些什么东西,这里就简单给各位整理一下。注意这里所整理的一些更新是相较于SpringSecurity5版本来说的,因此这部分的内容并不适合小白阅读,因为这是建立在你已经有了一些SpringSecurity基础的前提下的,所以如果是完全没学过SpringSecurity的童鞋,建议看看这篇上古掌控安全的神:SpringSecurity初探揭秘。它是是基于SpringSecurity5版本的快速入门文章,老肩巨猾,很好看,去看看吧。

2.1 Spring Boot和Spring Security的版本关系

Spring Boot 2 默认为 Spring Security 5,而 Spring Boot 3 使用 Spring Security 6。所以记住这一点,后续系列的文章所有的案例都是基于SpringBoot3以及Gradle的组合来进行的,当然,如果你还是Maven玩家,其实就理解学习层面来说并没有本质上的影响,无非是在实际的项目中更换一种构建方式罢了,不要觉得一看到是Gradle系的例子就跑路:

“哎呦!这项目没用我心爱的Maven,不适合我,溜了溜了!!”

2.2 Spring Security 6 新的变动

image-20240420184640041

Spring Security 6 引入了多项功能更新,以提高安全性和健壮性。它现在至少需要 Java 版本 17 并使用 jakarta 命名空间。,这个Java17可能听说过,但是jakarta 是什么鬼可能很多人没有了解过(这其中就有我一席之地),下面是来自 通义千文 的解释:

Jakarta 命名空间是Java生态系统中用于标识一组特定技术规范和API的标准前缀。这个命名空间起源于开源社区对Java企业版(Java EE)规范的继任者——Jakarta EE项目中的API和组件的重新命名。

背景

  • Java EE:最初由Sun Microsystems(后被Oracle收购)主导开发,是一套用于构建企业级Java应用程序的标准和规范集合,包括诸如Servlets、JSP、EJB、JMS、JPA等技术。这些规范定义了接口和行为,由第三方供应商(如IBM、Red Hat、Oracle等)提供具体的实现。Java EE规范中的API通常以javax.*命名空间开头。
  • Oracle与Java EE:随着Oracle对Java EE的管理和发展方向引起社区的关注和担忧,2017年,Oracle宣布将Java EE移交给开源组织,并停止在Java EE 8之后的版本开发。随后,Eclipse基金会接手了Java EE的后续开发工作,并将其重命名为Jakarta EE。
  • Jakarta EE:作为Java EE的开源替代品,Jakarta EE保留了大部分原有Java EE规范的功能和目标,但在治理模式、开发流程和知识产权等方面遵循更加开放和社区驱动的原则。为了反映这一转变,并避免与Oracle的商标权冲突,Eclipse基金会决定将所有相关的API包名从javax.*改为jakarta.*,形成了Jakarta命名空间。

Jakarta命名空间的意义

  1. 法律与商标独立:更改至jakarta.*命名空间,标志着这些技术规范与Oracle的商标权脱钩,完全由Eclipse基金会和开源社区掌控,不受单一商业公司的控制。
  2. 技术演进的新开端:Jakarta EE不仅沿袭了Java EE的核心规范,还在其基础上引入了新技术、新规范和现代化开发实践。使用新的命名空间象征着这一技术栈进入了一个新的发展阶段,不受过去版本约束,能够更快地响应市场需求和技术创新。
  3. 清晰的版本分界:由于命名空间的改变,开发者和工具能够清楚地区分基于旧Java EE(javax.*)和新Jakarta EE(jakarta.*)构建的应用程序及其依赖。这有助于平滑迁移、避免混淆,并为兼容性问题提供了明确的基准。
  4. 社区认同与生态建设:Jakarta命名空间体现了开源社区对这一技术栈所有权的认可和支持。随着越来越多的厂商和开发者采用Jakarta EE规范,围绕jakarta.*命名空间的开源库、框架、工具和服务生态系统逐渐形成,推动了企业级Java开发的持续发展。

别看™一大堆,其实你几乎可以不看他们,阅读一遍,有个简单的印象就好了。但Java17这块属于硬控,躲不开的。要想使用Spring Security6的话,还是得注意下哈。

下面简单列一下这个版本的主要变动:

  • 删除了 WebSecurityConfigurerAdapter,以支持基于组件的安全配置
  • authorizeRequests() 被删除并替换为 authorizeHttpRequests() 以定义授权规则。
  • 引入了 requestMatcher()securityMatcher() 等方法来替换 antMatcher()mvcMatcher() 来配置请求资源的安全性
    • requestMatcher() 方法更安全,因为它为请求配置选择了适当的 RequestMatcher 实现。
  • 弃用部分方法,如 cors()csrf() 推荐使用函数式编程。
  • 一些注解上的变化…

3. 版本升级

基于上一个标题列出得更新,这部分将会简单分享一下,如何将你项目中的 SpringSecurity5版本升级到 Spring Security6 版本,以适应最新的特性;这不算一个很大的版本迁移,但有必要了解新版特性以及如何使用它们。

  • @Configuration不再是@EnableWebSecurity注的一部分。因此我们在新版本(没有特殊说明,这里以及后续说的新版本和旧版本分别指的是SpringSecurity6SpringSecurity5)中需要同时给配置类加上这两个注解。
  • 新版本删除了 WebSecurityConfigurerAdapter 类,并采用基于组件的配置,我们在些SpringSecurity配置类时不再需要继承这个WebSecurityConfigurerAdapter,因此,结合上面两点,新版本的配置应该是下面这样的:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
    // more....
}
  • 新版本通过 WebSecurityCustomizer bean 来修改排除静态资源, 该接口替代了 WebSecurityConfigurerAdapter 接口中的 configure。当然,现在大部分项目都是前后端分离,这个配置相对来说没那么常用,但也不妨碍我们进步!!!!
@Bean
WebSecurityCustomizer webSecurityCustomizer() {
   return (web) -> web.ignoring().requestMatchers("/js/**", "/css/**");
}
  • 通过注册 InMemoryUserDetailsManager bean 来重构身份验证凭据逻辑:
@Bean
public UserDetailsService userDetailsService () {
    // Define user information in memory
    // Administrator
    UserDetails adminUser = User.withUsername("八尺妖剑") // Username
            .password("$2a$10$5GgerupMYdknnk.ln/9jK.MrQ39IcoO9vILlgPHigpAQ10PbLsoHS") // Password, {noop} for no encryption
            .roles("admin") // Assign roles
            .authorities("ROLE_test:show","user:name","user:list") 
            .build();
    // Build normal user information
    UserDetails users = User.withUsername("李四") // Username
            .password("$2a$10$5GgerupMYdknnk.ln/9jK.MrQ39IcoO9vILlgPHigpAQ10PbLsoHS") // Password, {noop} for no encryption
            .roles("user") // Assign role
            .build();
    // Store the constructed user information in SpringSecurity (in memory)
    InMemoryUserDetailsManager userDetailsManager = new InMemoryUserDetailsManager();
    userDetailsManager.createUser(adminUser);
    userDetailsManager.createUser(users);
    return userDetailsManager;
}
  • HTTP 安全配置,在旧版本中,我们一般通过重写 WebSecurityConfigurer 类中的 configure 方法来配置 HttpSecurity。由于它在最新版本中被删除,新版的配置方式是通过SecurityFilterChain bean 来进行。
@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
    // Configure CSRF to be disabled
    httpSecurity.csrf(AbstractHttpConfigurer::disable);

    // Configure request interception
    httpSecurity.authorizeHttpRequests(auth ->
                    auth.requestMatchers("/to_login","/user").permitAll().anyRequest().authenticated());

    // Specify login method: form, BASIC, etc.
    httpSecurity.formLogin(form -> form.loginPage("/to_login") // Redirect to custom login page
            .loginProcessingUrl("/doLogin") // Handle frontend requests, path matches frontend request path
            .usernameParameter("username")
            .passwordParameter("password")
            .defaultSuccessUrl("/index") // Default page to redirect to after successful login
    );
    return httpSecurity.build();
}
  • 当然,密码编码器得写法也可以通过注册Bean得方式来完成:
@Bean
public PasswordEncoder passwordEncoderParser() {
    // Build the password encoder
    return new BCryptPasswordEncoder();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1610404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV4.10使用形态运算提取水平线和垂直线

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV的查找命中或未命中 下一篇:OpenCV4.9图像金字塔-CSDN博客 目标 在本教程中,您将学习如何: 应用两个非常常见的形态运算符(即膨胀和…

java/C#语言开发的医疗信息系统10套源码

java/C#语言开发的医疗信息系统10套源码 云HIS系统源码,云LIS系统源码,PEIS体检系统,手麻系统 源 码,PACS系统源码,微源预约挂号源码,医院绩效考核源码,3D智能导诊系统源码,ADR药物…

数据分析场景,连号相关业务

连号相关业务 业务场景:现在需要从a列一堆编号中,将连号范围在10以内的数据分别分成一组。 先看实先效果 演示的为db2数据库,需要含有窗口函数,或者可以获取到当前数据偏移的上一位数据 第一步:将A列数据正序第二步…

【笔试强训_Day06】

文章目录 1.字符串相乘 1.字符串相乘 题目链接 解题思路: 高精度乘法,注意要学会下面这种列式相乘的形式🍎 注意细节❗: ① 🍎 首先把列式相乘的数据都存放到数组中去, 然后再对数组中的数据进行取余进…

Web开发:ASP.NET CORE的前端demo(纯前端)

目录 一、建立项目 二、删除无用文件 三、样式添加 四、写一个登录页面 五、登录主界面 一、建立项目 二、删除无用文件 三、样式添加 将你的图片资源添加在wwwroot下方,例如pics/logo.png 四、写一个登录页面 将Privacy.cshtml改为 Forget.cshtml &#xff0…

喜报 | 英码科技顺利通过2023年度广东省工程技术研究中心认定

近日,广东省科学技术厅公示了2023年度广东省工程技术研究中心的名单,英码科技设立的“广东省人工智能与边缘计算工程技术研究中心”顺利通过2023年度广东省工程技术研究中心的认定;英码科技在边缘计算领域的技术创新能力、科技成果转化再次获…

452. 用最少数量的箭引爆气球[排序+贪心]

https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xst…

ZooKeeper写数据流程

ZooKeeper写数据流程 初始化连接: 客户端初始化与 ZooKeeper 集群的连接,连接可以是 TCP 连接或者基于 UDP 的通信。客户端可以连接到集群中的任何一个节点。 查找 Leader: 当客户端发送写请求时,如果连接的节点不是 Leader&…

最新版frp将家里的nas机器内网穿透(含域名配置)

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 前言 最近,家里整了个nas,自此开始入坑nas,由于是黑群晖,所以没有带公网访问的功能,只能自己研究了。 好在之前用过frp,整过内网穿透&…

springboot+vue社区报修便民维修网站设计与实现

便民维修网站,主要的模块包括管理员;首页、个人中心、管理员管理、用户管理、维修人员管理、在线报修管理、联系客服管理、公司回访管理、基础数据管理、论坛管理、公告管理、轮播图信息,维修人员;首页、个人中心、维修人员评价管…

ViM-UNet:用于生物医学细分的 Vision Mamba

ViM-UNet:用于生物医学细分的 Vision Mamba 摘要IntroductionMethod and Experiments结果与讨论 ViM-UNet: Vision Mamba for Biomedical Segmentation 摘要 卷积神经网络(CNNs),尤其是UNet,是生物医学分割的默认架构…

springboot+java照相馆预约管理系统ssm

框架:ssm/springboot都有 jdk版本:1.8 及以上 ide工具:IDEA 或者eclipse 数据库: mysql 编程语言: java 前端:layuibootstrapjsp 详细技术:HTMLCSSJSjspspringmvcmybatisMYSQLMAVENtomcat 开发工具 IntelliJ IDEA: 一…

利用二维码定位技术实现桌面机器人简易定位方案(下篇)

目录 1、前言2、定位标签定义3、识别算法流程4、python编程4.1 查找三个回字定位点python4.2 根据三个定位点坐标位置关系,进行识别python4.3 根据实际坐标对当前图像进行矫正python4.4 计算物体的坐标值python 总结本篇对应python源码 1、前言 机械手臂尤其是工业…

vue全屏后下拉框失效

如图,vue页面有个全屏功能 问题:全屏后下拉菜单消失 解决:加个这个 :teleported"false"如果不行试试这个 :popper-append-to-body"false"ok我话说完

【1425】java 外籍人员管理系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 外籍人员管理系统是一套完善的java web信息管理系统 采用serlvetdaobean,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff…

Mac M3 安装Ollama和llama3,本地部署LobeChat和刘皇叔聊三国!

OllamaLobeChat,本地部署聊天助手 Ollama安装下载OllamaOllama常用指令和链接运行OllamaAPI 交互Ollama基于Llama 3角色扮演 LobeChat安装首先安装docker安装LobeChat的docker 镜像和运行 Ollama安装 下载Ollama 网址:https://ollama.com/ 支持macOS、…

每日一题(L2-011):玩转二叉树--建树+层序遍历

与L2-006近乎相同&#xff0c;先建树&#xff0c;然后遍历 #include<bits/stdc.h> using namespace std; int in[35]; int pre[35]; typedef struct Tree{int num;Tree* left;Tree* right; }T;T * build(int in1,int in2,int pre1,int pre2){T * tnew T;t->numpre[pr…

代码优化实践之税率计算问题

开篇 今天的问题来自于《编程珠玑》第三章【数据决定程序结构】&#xff0c;这里提出了几条代码优化相关的原则&#xff0c;受益不浅。下面是提到的几条原则&#xff1a; 使用数组重新编写重复代码。冗长的相似代码往往可以使用最简单的数据结构——数组来更好的表述&#xff1…

JS-29-Promise对象

一、JavaScript的异步操作 在JavaScript的世界中&#xff0c;所有代码都是单线程执行的。 由于这个“缺陷”&#xff0c;导致JavaScript的所有网络操作&#xff0c;浏览器事件&#xff0c;都必须是异步执行。异步执行可以用回调函数实现&#xff1a; function callback() {c…

三种空间数据的聚合算法

原始数据分布 给老外做的Demo&#xff0c;所以是英文界面。 原始数据分布情况如下&#xff1a; geojson文本内容&#xff1a; 三种方法基本原理 三种聚合算法来做一个例子&#xff08;500条记录&#xff09;。 方法1&#xff1a;按Ol默认方法进行聚类&#xff0c;使用Open…