最新版Spring Security 中的路径匹配方案!
@[toc] Spring Security 是一个功能强大且可高度定制的安全框架,它提供了一套完整的解决方案,用于保护基于 Spring 的应用程序。在 Spring Security 中,路径匹配是权限控制的核心部分,它决定了哪些请求可以访问特定的资源。本文将详细介绍 Spring Security 中的路径匹配策略,并提供相应的代码示例。
在旧版的 Spring Security 中,路径匹配方法有很多,但是新版 Spring Security 对这些方法进行了统一的封装,都是调用 requestMatchers 方法进行处理:
public C requestMatchers(RequestMatcher... requestMatchers) { Assert.state(!this.anyRequestConfigured, "Can't configure requestMatchers after anyRequest"); return chainRequestMatchers(Arrays.asList(requestMatchers)); }
requestMatchers 方法接收一个 RequestMatcher 类型的参数,RequestMatcher 是一个接口,这个接口是一个用来确定 HTTP 请求是否与给定的模式匹配的工具。这个接口提供了一种灵活的方式来定义请求的匹配规则,从而可以对不同的请求执行不同的安全策略。
所以在新版 Spring Security 中,不同的路径匹配分方案实际上就是不同的 RequestMatcher 的实现类。
1. AntPathRequestMatcher
AntPathRequestMatcher
是 Spring 中最常用的请求匹配器之一,它使用 Ant 风格的路径模式来匹配请求的 URI。
1.1 什么是 Ant 风格的路径模式
Ant 风格的路径模式(Ant Path Matching)是一种用于资源定位的模式匹配规则,它源自 Apache Ant 这个 Java 构建工具。在 Ant 中,这种模式被用来指定文件系统中的文件和目录。由于其简单性和灵活性,Ant 风格的路径模式也被其他许多框架和应用程序所采用,包括 Spring Security。
Ant 风格的路径模式使用了一些特殊的字符来表示不同级别的路径匹配:
-
?
:匹配任何单个字符(除了路径分隔符)。 -
*
:匹配任何字符的序列(除了路径分隔符),但不包括空字符串。 -
**
:匹配任何字符的序列,包括空字符串。至少匹配一个字符的序列,并且可以跨越路径分隔符。 -
{}
:表示一个通配符的选择,可以匹配多个逗号分隔的模式。例如,{,春夏秋冬}
可以匹配任何以春夏秋冬开头的字符串。 -
[]
:在某些实现中,可以用于匹配括号内的单个字符。 -
()
:在某些实现中,可以用于分组匹配。
在 Spring Security 中,Ant 风格的路径模式通常用于定义 URL 路径和安全配置之间的映射关系。例如,你可以使用 Ant 风格的路径模式来指定哪些 URL 路径需要特定的权限或角色。
以下是一些 Ant 风格路径模式的例子:
-
/users/*
:匹配以/users/
开始的任何路径,如/users/123
或/users/profile
。 -
/users/**
:匹配以/users/
开始的任何路径,包括子路径,如/users/123
或/users/profile/picture
. -
/users/123
:精确匹配/users/123
。 -
/users/{id}
:虽然这不是 Ant 风格的模式,但它展示了路径参数匹配,可以匹配/users/123
、/users/456
等。 -
/files/**.{jpg,png}
:匹配/files/
下所有以.jpg
或.png
结尾的文件路径,如/files/image1.jpg
或/files/folder/image.png
。
通过使用 Ant 风格的路径模式,你可以灵活地定义复杂的 URL 匹配规则,以适应不同的安全需求。
1.2 基本用法
import org.springframework.security.web.util.matcher.AntPathRequestMatcher; // 创建 AntPathRequestMatcher 实例 RequestMatcher antMatcher = new AntPathRequestMatcher("/users/**", "GET"); // 使用 matcher 进行匹配 boolean isMatch = antMatcher.matches(request);
1.3 通配符
?
匹配任何单字符。*
匹配任何字符序列(但不包括目录分隔符)。**
匹配任何字符序列,包括目录分隔符。
// 匹配 /admin 下的任何资源,包括子目录 RequestMatcher adminMatcher = new AntPathRequestMatcher("/admin/**"); // 匹配 /files 目录下的任何 HTML 文件 RequestMatcher fileMatcher = new AntPathRequestMatcher("/files/*.{html,htm}", "GET");
2. RegexRequestMatcher
RegexRequestMatcher
使用正则表达式来匹配请求的 URI 和 HTTP 方法。
2.1 基本用法
import org.springframework.security.web.util.matcher.RegexRequestMatcher; // 创建 RegexRequestMatcher 实例 RequestMatcher regexMatcher = new RegexRequestMatcher("^/api/.*", "GET"); // 使用 matcher 进行匹配 boolean isMatch = regexMatcher.matches(request);
2.2 使用正则表达式
// 匹配任何以 /api 开头的 URI RequestMatcher apiMatcher = new RegexRequestMatcher("^/api/.*"); // 匹配任何 HTTP 方法 RequestMatcher anyMethodMatcher = new RegexRequestMatcher("^/.*", "GET|POST|PUT|DELETE");
2.3 结合 Spring Security
下面这段代码,表示拦截所有以 html、css 以及 js 结尾的请求,这些请求可以直接访问:
@Configuration public class SecurityConfig { @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(a -> a.requestMatchers(new RegexRequestMatcher("^.*\\.(htm|css|js)$","GET")).permitAll()) .formLogin(Customizer.withDefaults()) .csrf(c -> c.disable()); return http.build(); } }
3. RequestHeaderRequestMatcher
RequestHeaderRequestMatcher
用来匹配请求头中的键和值。
import org.springframework.security.web.util.matcher.RequestHeaderRequestMatcher; // 创建 RequestHeaderRequestMatcher 实例 RequestMatcher headerMatcher = new RequestHeaderRequestMatcher("User-Agent", "Mozilla.*"); // 使用 matcher 进行匹配 boolean isMatch = headerMatcher.matches(request);
具体到 Spring Security 中,用法如下:
@Configuration public class SecurityConfig { @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(a -> a.requestMatchers(new RequestHeaderRequestMatcher("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36")).permitAll()) .formLogin(Customizer.withDefaults()) .csrf(c -> c.disable()); return http.build(); } }
4. NegatedRequestMatcher
NegatedRequestMatcher
允许你否定一个已有的 RequestMatcher
的匹配结果。
import org.springframework.security.web.util.matcher.NegatedRequestMatcher; // 创建一个 matcher,然后否定它的匹配结果 RequestMatcher notAdminMatcher = new NegatedRequestMatcher(adminMatcher); // 使用 negated matcher 进行匹配 boolean isNotMatch = notAdminMatcher.matches(request);
例如下面这段代码表示除了 /hello
之外的地址,全都可以直接访问:
@Configuration public class SecurityConfig { @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(a -> a.requestMatchers(new NegatedRequestMatcher(new AntPathRequestMatcher("/hello"))).permitAll()) .formLogin(Customizer.withDefaults()) .csrf(c -> c.disable()); return http.build(); } }
5. AndRequestMatcher 和 OrRequestMatcher
AndRequestMatcher
和 OrRequestMatcher
分别用来组合多个 RequestMatcher
实例,进行“与”或“或”的逻辑匹配。
5.1 AndRequestMatcher
import org.springframework.security.web.util.matcher.AndRequestMatcher; // 组合多个 matcher 进行“与”匹配 RequestMatcher andMatcher = new AndRequestMatcher(apiMatcher, headerMatcher); // 使用 andMatcher 进行匹配 boolean isMatch = andMatcher.matches(request);
5.2 OrRequestMatcher
import org.springframework.security.web.util.matcher.OrRequestMatcher; // 组合多个 matcher 进行“或”匹配 RequestMatcher orMatcher = new OrRequestMatcher(adminMatcher, fileMatcher); // 使用 orMatcher 进行匹配 boolean isMatch = orMatcher.matches(request);
6. 总结
Spring 提供了多种 RequestMatcher
实现类,以满足不同的请求匹配需求。通过合理地使用这些匹配器,可以灵活地定义和实施安全策略。在实际应用中,你可能需要根据业务需求选择合适的匹配器,并结合 Spring Security 的配置来实现细粒度的访问控制。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
清华全球大模型报告出炉,文心一言语文数学双料第一
最近,由清华大学基础模型研究中心联合中关村实验室研制的SuperBench大模型综合能力评测框架,正式对外发布2024年3月版《SuperBench大模型综合能力评测报告》。评测共包含了14个海内外具有代表性的模型,结果显示:文心一言4.0表现亮眼,与国际一流模型水平接近,且差距已经逐渐缩小,名副其实为国内头部模型。 例如在人类对齐能力评测中,文心一言4.0表现优异,位居国内第一,其中在中文推理、中文语言等评测上,文心一言遥遥领先,和其他模型拉开明显差距,中文理解上,文心一言4.0领先优势明显,领先第二名GLM-40.41分,GPT-4系列模型表现较差,排在中下游,并且和第一名文心一言4.0分差超过1分。 在语义理解中的数学能力上,文心一言4.0与Claude-3并列全球第一;GPT-4系列模型位列第四五,其他模型得分在55分附近较为集中,明显落后第一梯队;而在语义理解中的阅读理解能力上,文心一言4.0超过GPT-4 Turbo、Claude-3以及GLM-4拿下榜首。 而在企业选择大模型最看重的安全性评测上,国内模型文心一言4.0表现亮眼,力压国际一流模型GPT-4系列模型和Clau...
- 下一篇
手把手教你实现 OceanBase 数据到 Apache Doris 的便捷迁移|实用指南
作者|SelectDB 技术团队 作为广受认可的分布式数据库,OceanBase 已在众多企业关键业务系统中得到广泛应用。在 Apache Doris 社区,有众多用户选择基于 OceanBase 与 Apache Doris 以构建强大的数据处理与分析链路,本文将详细介绍如何便捷高效将数据从 OceanBase 迁移/同步至 Apache Doris 。 实用指南 00 环境准备 使用 Docker 启动 Oceanbase 服务,OceanBase Docker 环境搭建可参考 Oceanbase 文档 - 使用 Docker 部署 OceanBase 数据库 docker run -p 2881:2881 --name oceanbase -e MINI_MODE=1 -d oceanbase/oceanbase-ce:4.0.0.0 在 OceanBase 中创建表并增加数据 [root@VM-10-6-centos ~]$ mysql -h127.0.0.1 -P2881 -uroot mysql> CREATE DATABASE ob; Query O...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS关闭SELinux安全模块
- Docker安装Oracle12C,快速搭建Oracle学习环境