新版 Spring Security 配置的变化

news2024/10/7 19:19:54

进入到 SpringBoot2.7 时代,有小伙伴发现有一个常用的类忽然过期了:

图片

在 Spring Security 时代,这个类可太重要了。过期的类当然可以继续使用,但是你要是决定别扭,只需要稍微看一下注释,基本上就明白该怎么玩了。

我们来看下 WebSecurityConfigurerAdapter 的注释:

图片

从这段注释中我们大概就明白了咋回事了。

以前我们自定义类继承自 WebSecurityConfigurerAdapter 来配置我们的 Spring Security,我们主要是配置两个东西:

  • configure(HttpSecurity)
  • configure(WebSecurity)

前者主要是配置 Spring Security 中的过滤器链,后者则主要是配置一些路径放行规则。

现在在 WebSecurityConfigurerAdapter 的注释中,人家已经把意思说的很明白了:

  1. 以后如果想要配置过滤器链,可以通过自定义 SecurityFilterChain Bean 来实现。
  2. 以后如果想要配置 WebSecurity,可以通过 WebSecurityCustomizer Bean 来实现。

那么接下来我们就通过一个简单的例子来看下。

首先我们新建一个 Spring Boot 工程,引入 Web 和 Spring Security 依赖,注意 Spring Boot 选择最新的 2.7。

图片

接下来我们提供一个简单的测试接口,如下:

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello 江南一点雨!";
    }
}

小伙伴们知道,在 Spring Security 中,默认情况下,只要添加了依赖,我们项目的所有接口就已经被统统保护起来了,现在启动项目,访问 /hello 接口,就需要登录之后才可以访问,登录的用户名是 user,密码则是随机生成的,在项目的启动日志中。

现在我们的第一个需求是使用自定义的用户,而不是系统默认提供的,这个简单,我们只需要向 Spring 容器中注册一个 UserDetailsService 的实例即可,像下面这样:

@Configuration
public class SecurityConfig {

    @Bean
    UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
        users.createUser(User.withUsername("javaboy").password("{noop}123").roles("admin").build());
        users.createUser(User.withUsername("江南一点雨").password("{noop}123").roles("admin").build());
        return users;
    }

}

这就可以了。

当然我现在的用户是存在内存中的,如果你的用户是存在数据库中,那么只需要提供 UserDetailsService 接口的实现类并注入 Spring 容器即可,这个之前在 vhr 视频中讲过多次了(公号后台回复 666 有视频介绍),这里就不再赘述了。

但是假如说我希望 /hello 这个接口能够匿名访问,并且我希望这个匿名访问还不经过 Spring Security 过滤器链,要是在以前,我们可以重写 configure(WebSecurity) 方法进行配置,但是现在,得换一种玩法:

@Configuration
public class SecurityConfig {

    @Bean
    UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
        users.createUser(User.withUsername("javaboy").password("{noop}123").roles("admin").build());
        users.createUser(User.withUsername("江南一点雨").password("{noop}123").roles("admin").build());
        return users;
    }

    @Bean
    WebSecurityCustomizer webSecurityCustomizer() {
        return new WebSecurityCustomizer() {
            @Override
            public void customize(WebSecurity web) {
                web.ignoring().antMatchers("/hello");
            }
        };
    }

}

以前位于 configure(WebSecurity) 方法中的内容,现在位于 WebSecurityCustomizer Bean 中,该配置的东西写在这里就可以了。

那如果我还希望对登录页面,参数等,进行定制呢?继续往下看:

@Configuration
public class SecurityConfig {

    @Bean
    UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
        users.createUser(User.withUsername("javaboy").password("{noop}123").roles("admin").build());
        users.createUser(User.withUsername("江南一点雨").password("{noop}123").roles("admin").build());
        return users;
    }

    @Bean
    SecurityFilterChain securityFilterChain() {
        List<Filter> filters = new ArrayList<>();
        return new DefaultSecurityFilterChain(new AntPathRequestMatcher("/**"), filters);
    }

}

Spring Security 的底层实际上就是一堆过滤器,所以我们之前在 configure(HttpSecurity) 方法中的配置,实际上就是配置过滤器链。现在过滤器链的配置,我们通过提供一个 SecurityFilterChain Bean 来配置过滤器链,SecurityFilterChain 是一个接口,这个接口只有一个实现类 DefaultSecurityFilterChain,构建 DefaultSecurityFilterChain 的第一个参数是拦截规则,也就是哪些路径需要拦截,第二个参数则是过滤器链,这里我给了一个空集合,也就是我们的 Spring Security 会拦截下所有的请求,然后在一个空集合中走一圈就结束了,相当于不拦截任何请求。

此时重启项目,你会发现 /hello 也是可以直接访问的,就是因为这个路径不经过任何过滤器。

其实我觉得目前这中新写法比以前老的写法更直观,更容易让大家理解到 Spring Security 底层的过滤器链工作机制。

有小伙伴会说,这写法跟我以前写的也不一样呀!这么配置,我也不知道 Spring Security 中有哪些过滤器,其实,换一个写法,我们就可以将这个配置成以前那种样子:

@Configuration
public class SecurityConfig {

    @Bean
    UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
        users.createUser(User.withUsername("javaboy").password("{noop}123").roles("admin").build());
        users.createUser(User.withUsername("江南一点雨").password("{noop}123").roles("admin").build());
        return users;
    }

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .permitAll()
                .and()
                .csrf().disable();
        return http.build();
    }

}

这么写,就跟以前的写法其实没啥大的差别了。

好啦,多余的废话我就不多说了,小伙伴们可以去试试最新玩法啦~

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

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

相关文章

机器视觉公司,在玩一局玩不起的游戏

导语 有个著名咨询公司曾经预测过&#xff1a;未来只有两种公司&#xff0c;是人工智能的和不赚钱的。 它可能没想到&#xff0c;还有第三种——不赚钱的AI公司。 去年我们报道过“正在消失的机器视觉公司”&#xff0c;昔日的“AI 四小龙”&#xff08; 商汤、旷视、云从、依图…

大数据 | HBase基本工作原理

前文回顾&#xff1a;MapReduce基本原理 目录 &#x1f4da;HBase基本介绍 &#x1f407;HBase的设计目标和功能特点 &#x1f407;HBase在Hadoop中的生态环境 &#x1f4da;HBase的数据模型 &#x1f407;逻辑数据模型 &#x1f407;物理存储格式 &#x1f4da;HBase基…

rust网络编程以及unsafe模块

网络层目前 IPv4 和 IPv6 分庭抗礼&#xff0c;IPv6 还未完全对 IPv4 取而代之&#xff1b;传输层除了对延迟非常敏感的应用&#xff08;比如游戏quic协议&#xff09;&#xff0c;绝大多数应用都使用 TCP&#xff1b;而在应用层&#xff0c;对用户友好&#xff0c;且对防火墙友…

PageRank算法介绍

互联网上有数百亿个网页&#xff0c;可以分为这么几类&#xff1a;不含有用信息的&#xff0c;比如垃圾邮件&#xff1b;少数人比较感兴趣的&#xff0c;但范围不是很广的&#xff0c;比如个人博客、婚礼公告或家庭像册&#xff1b;很多人感兴趣的并且十分有用的&#xff0c;比…

基于DBN神经网络的语音分类识别

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) DBN的语音分类识别 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类算法,本文将DBN算法应用于语音分类 DBN神…

排污口漂浮物监测系统 yolov5

排污口漂浮物监测系统通过YOLOV5网络模型技术&#xff0c;排污口漂浮物监测算法模型对河道两岸各处排污口进行7*24小时不间断实时监测&#xff0c;当监测到河道两岸的排污口违规乱排乱放时&#xff0c;不需人为干预系统立即抓拍存档告警。我们选择当下YOLO卷积神经网络YOLOv5来…

实现数字化转型升级,快速开发平台流辰信息来助力!

在如今迅猛发展的年代里&#xff0c;科技的力量是伟大的&#xff0c;可以让老百姓的生活变得丰富多彩&#xff0c;也可以让各行各业的企业实现办公自动化&#xff0c;朝着数字化转型升级&#xff0c;快速提升办公协作效率。快速开发平台流辰信息作为一家低代码平台服务商&#…

(顺序栈)有效括号序列

文章目录前言&#xff1a;问题描述&#xff1a;问题解析&#xff1a;代码实现&#xff1a;总结&#xff1a;前言&#xff1a; 此篇是针对顺序栈的经典练习题。 问题描述&#xff1a; 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘…

iOS / iPadOS 15.7.4发布安全更新 旧版iPhone和ipad无法升级系统解决方法

苹果于昨日面向无法升级到 iOS / iPadOS 16 的旧款 iPhone 和 iPad&#xff0c;发布了 iOS / iPadOS 15.7.4 更新。本次更新并未引入新的功能&#xff0c;而是重点修复了存在于 WebKit 的两个“关键”漏洞。 iOS / iPadOS 15.7.4发布安全更新&#xff1a; 目前已经有充足的证据…

adb基本操作操作

Mumu模拟器 进入终端 cd C:\Program Files\Netease\MuMuPlayer-12.0\shell 获取root权限 adb root 连接手机 adb connect 127.0.0.1:7555 adb shell 查看连接多少台设备 adb devices 安装程序apk adb install C:\Android\CalcTest.apk adb install -r C:\Android\CalcT…

遥感常用库的比较:Rasterio vs GDAL

一、前言本博客对三种栅格处理工具做一个小小的比较&#xff1a;Python (rasterio) 和 GDAL。当我开始使用 GIS 和栅格处理时&#xff0c;我并没有真正关注我编写的脚本和使用的工具的性能。 但现在&#xff0c;处理更大的数据、更高的空间分辨率、快速处理我的光栅文件是成功的…

国产PIE-SAR软件

1.产品定位 PIE-SAR是一款针对国内外主流星载SAR传感器的数据处理分析软件&#xff0c;提供图形化操作界面。目前已支持国内外主流星载SAR传感器的数据处理与分析&#xff0c;包括强度图像基础处理、区域网平差处理&#xff08;含异源匹配、RD/RPC区域网平差&#xff09;、InS…

TensorFlow 1.x 深度学习秘籍:1~5

原文&#xff1a;TensorFlow 1.x Deep Learning Cookbook 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如…

知识图谱学习笔记——(二)知识图谱的表示

一、知识学习 声明&#xff1a;知识学习中本文主体按照浙江大学陈华钧教授的《知识图谱》公开课讲义进行介绍&#xff0c;并个别地方加入了自己的注释和思考&#xff0c;希望大家尊重陈华钧教授的知识产权&#xff0c;在使用时加上出处。感谢陈华钧教授。 &#xff08;一&…

Node版本管理工具

一、nvm简述 官网地址&#xff1a;https://nvm.uihtm.com/ nvm&#xff08;全称&#xff1a;node.js version management&#xff09;&#xff0c;是一个nodejs的版本管理工具&#xff0c;为解决node.js各种版本存在不兼容问题&#xff0c;可以使用nvm工具快速安装和切换不同版…

领英精灵安全吗?附LinkedIn(领英)开发客户的关键点

面对全球最大的职场社交平台——LinkedIn(领英)&#xff0c;很多蠢蠢欲动的外贸新人经常会问到&#xff1a;为什么那么多的外贸培训课程&#xff0c;机构和讲师以及一些外贸老鸟都会提到“如果想要把LinkedIn(领英)经营成一个有效的客户开发渠道&#xff0c;都会建议利用针对Li…

【机器学习】P17 梯度下降 与 梯度下降优化算法(BGD 等 与 Adam Optimizer、AdaGrad、RMSProp)

梯度下降与梯度下降算法梯度下降梯度下降算法基础优化算法批量梯度下降 BGD随机梯度下降 SGD小批量梯度下降 MBGD动量梯度下降 MGD基础优化算法上的改进和优化的算法自适应梯度算法 Adagrad均方根传播算法 RMSProp自适应矩估计算法 Adam代码如何实现梯度下降如何判断收敛梯度下…

pytorch搭建ResNet50实现鸟类识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f366; 参考文章地址&#xff1a; 365天深度学习训练营-第J1周&#xff1a;ResNet-50算法实战与解析 &#x1f356; 作者&#xff1a;K同学啊 理论知识储备 深度残差网络ResNet&#xff08;dee…

KD2511N高精度直流低电阻值测试仪

一、产品简介 KD2511N直流低电阻测试仪采用32bits CPU和高密度 SMD贴装工艺&#xff0c; 拥有0.05%的 电阻测量精度及1uΩ 小电阻分辨率&#xff0c;内部比较器可让使用者自行设定上限/下限参考比较值。高达每秒15次的测试速度能显著提高工作效率&#xff0c;免清零的设计在小电…

数据结构刷题笔记 | 数组、字符串、链表、栈、队列、数、图

本篇为笔者学习数据结构时&#xff0c;在牛客网站的刷题笔记。 数据结构分为&#xff1a; 逻辑结构【面向问题的】 集合结构线性结构&#xff08;一对一&#xff09;树形结构&#xff08;一对多的层次关系&#xff09;图形结构&#xff08;多对多&#xff09; 物理结构&#x…