当前位置: 首页 > article >正文

SpringSecurity基于配置方法控制访问权限:MVC匹配器、Ant匹配器

Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。在 Spring Security 中,可以通过配置方法来控制访问权限。认证是实现授权的前提和基础,在执行授权操作前需要明确目标用户,只有明确目标用户才能明确它所具备的角色和权限。Spring Security 中所采用的授权模型也是由用户、角色和权限组成的。

Spring Security 实现配置方法控制访问权限很简单,只需要使用基于 HttpSecurity 对象提供的一组工具方法就能实现复杂场景下的访问控制。

Spring Security 中常见的配置方法及其作用:

配置方法作用
anonymous()允许匿名访问。
anyRequest()匹配所有的请求。
authenticated()所有匹配的 URL 都需要被认证才能访问。
permitAll()无条件允许一切用户访问。
hasAuthority(String)允许具有特定权限的用户访问。
hasAnyAuthority(String)允许具有任一权限的用户访问。
hasRole(String)允许具有特定角色的用户访问。
hasAnyRole(String)允许具有任一角色的用户访问。
hasIpAddress()允许来自特定 IP 地址的用户访问。
denyAll()无条件禁止一切访问。
access()该方法允许开发人员传入一个表达式进行更加细颗粒度的权限控制。
mvcMatchers(String)通过 MVC 匹配器,匹配 HTTP 端点的访问路径。
antMatchers(String)通过 Ant 匹配器,匹配 HTTP 端点的访问路径。
regexMatchers(String)通过正则表达式匹配器,匹配 HTTP 端点的访问路径。

综合实例:

Spring Security 的核心配置类,WebSecurityConfig 类(Spring Security 配置类),并添加 @EnableWebSecurity 注解和继承 WebSecurityConfigurerAdapter 类。

/*** Spring Security 配置类* @author pan_junbiao**/
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{//公开权限的路径(白名单)private static final String[] WHITE_LIST = {"/admin/getLoginAdmin","/js/**","/captcha.jpg"};@Overrideprotected void configure(HttpSecurity http) throws Exception{http.authorizeRequests() //返回一个URL拦截注册器.antMatchers(WHITE_LIST).permitAll() //公开其权限(公开的权限必须放在最上面).antMatchers("/account/**").hasAnyRole("SUPER_ADMIN","GENERAL_ADMIN") //设置授权角色(普通管理员).antMatchers("/log/**").hasAnyRole("SUPER_ADMIN","GENERAL_ADMIN") //设置授权角色(普通管理员).antMatchers("/**").hasRole("SUPER_ADMIN") //设置授权角色(超级管理员).anyRequest() //匹配所有的请求.authenticated() //所有匹配的URL都需要被认证才能访问.and() //结束当前标签,让上下文回到 HttpSecurity.formLogin() //启动表单认证.loginPage("/myLogin.html") //自定义登录页面.loginProcessingUrl("/auth/form") //指定处理登录请求路径.permitAll() //使登录页面不设限访问.and().csrf().disable(); //关闭CSRF的防御功能}
}

1、Spring Security 中的权限和角色

在权限和角色的概念中,两者都是用于管理系统中用户访问权限的重要机制,但它们有着不同的含义和用途。角色代表用户在系统中的身份或职位。它是权限的一种组合方式,通常用于描述用户在组织或系统中的职责和权限级别。权限表示用户可以执行的具体操作或访问的具体资源。它是更细粒度的控制机制,用于描述用户在系统中的具体操作权限。

Spring Security 的核心配置类,WebSecurityConfig 类中,configure(HttpSecurity http)  方法,如下所示。

@Override
protected void configure(HttpSecurity http) throws Exception
{http.authorizeRequests() //返回一个URL拦截注册器.anyRequest()    //匹配所有的请求.authenticated() //所有匹配的URL都需要被认证才能访问.and()           //结束当前标签,让上下文回到 HttpSecurity.formLogin()     //启动表单认证.and().httpBasic();
}

1.1 基于权限进行访问配置

基于权限进行访问配置是确保系统安全性的重要手段。权限表示用户可以执行的具体操作或访问的具体资源。

Spring Security 提供了一组权限的配置方法,如下:

  • hasAuthority(String):允许具有特定权限的用户访问。
  • hasAnyAuthority(String):允许具有任一权限的用户访问。

可以使用上述方法来判断用户是否具备对应的访问权限。

【示例】使用 hasAuthority(String) 方法,配置具有特定权限的用户访问。

@Override
protected void configure(HttpSecurity http) throws Exception
{http.authorizeRequests() //返回一个URL拦截注册器.antMatchers("/user/**").hasAuthority("user:info"); //配置权限:允许具有特定权限的用户访问
}

【示例】使用 hasAnyAuthority(String) 方法,配置具有任一权限的用户访问。

@Override
protected void configure(HttpSecurity http) throws Exception
{http.authorizeRequests() //返回一个URL拦截注册器.antMatchers("/user/**").hasAnyAuthority("user:add","user:edit","user:delete"); //配置权限列表:允许具有任一权限的用户访问
}

1.2 基于角色进行访问配置

角色是权限的一种组合方式,用于描述用户在系统中的身份或职责,角色可以包含多个权限,但权限不一定属于某个角色(可以独立存在)。

Spring Security 提供了一组角色的配置方法,如下:

  • hasRole(String):允许具有特定角色的用户访问。
  • hasAnyRole(String):允许具有任一角色的用户访问。

可以使用上述方法来判断用户是否具备对应的访问角色。

【示例】使用 hasRole(String) 方法,配置具有特定角色的用户访问。

@Override
protected void configure(HttpSecurity http) throws Exception
{http.authorizeRequests() //返回一个URL拦截注册器.antMatchers("/user/**").hasRole("USER_INFO"); //配置角色:允许具有特定角色的用户访问
}

【示例】使用 hasAnyRole(String) 方法,配置具有任一角色的用户访问。

@Override
protected void configure(HttpSecurity http) throws Exception
{http.authorizeRequests() //返回一个URL拦截注册器.antMatchers("/user/**").hasAnyRole("USER_INFO", "SUPER_ADMIN", "GENERAL_ADMIN"); //配置角色:允许具有任一角色的用户访问。
}

1.3 使用 access() 实现更加细颗粒度的权限控制

由于 hasAuthority(String)、hasAnyAuthority(String)、hasRole(String)、hasAnyRole(String) 方法都比较简单,但局限性也很大,因此无法基于一些环境和业务参数灵活控制范围规则。为此,Spring Security 提供了  access() 方法,该方法允许开发人员传入一个表达式进行更加细颗粒度的权限控制。这里将引入 SpEL( Spring 表达式语言,Spring Expression Language)表达式,它是 Spring 框架提供的一种动态表达式语言。基于 SpEL,只要该表达式的返回值为 true,那么 access() 方法允许用户访问。

【示例】使用 access() 实现更加细颗粒度的权限控制。

@Override
protected void configure(HttpSecurity http) throws Exception
{//定义权限规则:只能拥有 “user:add” 权限,且不拥有 “user:delete” 权限的用户才能访问String expression = "hasAuthority('user:add') and !hasAuthority('user:delete')";//设置权限http.authorizeRequests() //返回一个URL拦截注册器.antMatchers("/user/**").access(expression);
}

上述代码的执行效果是只能拥有 “user:add” 权限,且不拥有 “user:delete” 权限的用户才能访问。

2、使用配置方法控制访问权限

确保请求安全的手段是对访问进行限制,只有那些具有访问限制的请求才能被服务器处理。那么,如何让 HTTP 请求与权限控制过程产生关联呢?答案还是使用 Spring Security 提供的配置方法。Spring Security 提供了三种强大的匹配器(Matcher)来实现这一目标,分别是 MVC 匹配器、Ant 匹配器及正则表达式匹配器。

2.1 MVC 匹配器

在三种匹配器中,MVC 匹配器的使用方法比较简单,基于 HTTP 端点的访问路径进行匹配即可。

【示例】使用 MVC 匹配器,基于 HTTP 端点的访问路径匹配权限访问。

@Override
protected void configure(HttpSecurity http) throws Exception
{http.authorizeRequests().mvcMatchers("/user/*").hasRole("USER").mvcMatchers("/admin").hasRole("ADMIN").anyRequest().authenticated();
}

现在又有一个新的问题,如果一个 Controller 中存在两个路径完全一样的 HTTP 端点呢?这种情况是存在的。对于 HTTP 端点而言,就算路劲一样,只要所使用的 HTTP 方法不同,那就是不同的两个端点。

【示例】针对上述问题,MVC 匹配器还提供了重载的 mvcMatchers() 方法。

@Override
protected void configure(HttpSecurity http) throws Exception
{http.authorizeRequests().mvcMatchers(HttpMethod.POST, "/hello").authenticated().mvcMatchers(HttpMethod.GET, "/hello").permitAll().anyRequest().denyAll(); //拒绝
}

同时,如果想对某个路径下的所有子路径都指定同样的访问控制,在该路径后面添加“*”符号即可。

【示例】使用“*”符号,配置某个路径下的所有子路径。

@Override
protected void configure(HttpSecurity http) throws Exception
{http.authorizeRequests().mvcMatchers(HttpMethod.POST, "/user/*").authenticated();
}

2.2 Ant 匹配器

Ant 匹配器的表现形式和使用方法与前面介绍的 MVC 匹配器非常类似,也提供了如下的三个方法来完成请求与 HTTP 端点地址之间的匹配关系。

  • antMatchers(String... antPatterns)
  • antMatchers(HttpMethod method)
  • antMatchers(HttpMethod method, String... antPatterns)

【示例】使用 Ant 匹配器,匹配 HTTP 端点地址。

@Override
protected void configure(HttpSecurity http) throws Exception
{http.authorizeRequests().antMatchers("/user").hasRole("USER").antMatchers(HttpMethod.POST, "/admin").hasRole("ADMIN").anyRequest().authenticated();
}

注意:在浏览器的地址栏最后面添加“/”符号,如:http://localhost:8080/user/,这样才会得到正确的访问结果。

显然,Ant 匹配器处理请求地址的方式有点让人感到困惑,而使用 MVC 匹配器则没有这个问题,无论请求地址的末尾是否存在“/”符号,它都是正确匹配。

所以在日常开发过程中,我们更倾向于使用 MVC 匹配器而非 Ant 匹配器,原因在于 Ant 匹配器在匹配路径上存在一定风险。

2.3 正则表达式匹配器

最后要介绍的匹配器是正则表达式匹配器。它提供的两个配置方法如下:

  • regexMatchers(String... regexPatterns)
  • regexMatchers(HttpMethod method, String... regexPatterns)

使用正则表达式匹配器的主要优势在于它能够基于复杂的正则表达式对请求地址进行匹配。

【示例】使用正则表达式匹配器,匹配常见的邮箱地址。

@Override
protected void configure(HttpSecurity http) throws Exception
{http.authorizeRequests().regexMatchers("/email/{email:.*(.+@.+\\.com)}").permitAll().anyRequest().denyAll();
}

相关文章:

SpringSecurity基于配置方法控制访问权限:MVC匹配器、Ant匹配器

Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。在 Spring Security 中,可以通过配置方法来控制访问权限。认证是实现授权的前提和基础,在执行授权操作前需要明确目标用户,只有明确目标用户才能明确它所具备的角色和权…...

Ubuntu22.04 - gflags的安装和使用

目录 gflags 介绍gflags 安装gflags 使用 gflags 介绍 gflags 是Google 开发的一个开源库,用于 C应用程序中命令行参数的声明、定义和解析。gflags 库提供了一种简单的方式来添加、解析和文档化命令行标志(flags),使得程序可以根据不同的运行时配置进行调整。 它具…...

java | MyBatis-plus映射和golang映射对比

文章目录 Java实体类和数据库的映射1.默认驼峰命名规则2.自定义字段映射3.关闭驼峰命名规则4.JSON序列化映射 Golang1. 结构体与表的映射2. 字段与列的映射3. 关联关系映射4. 其他映射相关标签 这篇也是做数据库映射方面的对比: Java 实体类和数据库的映射 1.默认…...

使用 Redis 实现 RBAC 权限管理

1. 什么是 RBAC? RBAC(Role-Based Access Control,基于角色的访问控制)是一种常见的权限管理模型,它通过用户(User)、角色(Role)、权限(Permission&#xff…...

正则表达式–断言

原文地址:正则表达式–断言 – 无敌牛 欢迎参观我的个人博客:正则表达式特殊字符 – 无敌牛 断言assertions 1、(?...):正向预查(positive lookahead),表示某个字符串后面应该跟着什么。但这个字符串本身…...

Python常见面试题的详解14

1. 从变量 A 中匹配 JSON 字符串 在处理文本数据时,有时需要从变量里找出其中的 JSON 字符串。JSON 字符串一般以 { 或 [ 开头,以 } 或 ] 结尾,但简单的正则匹配可能不够严谨,所以还需用 json 模块进行验证。 要点 利用正则表达…...

电脑想安装 Windows 11 需要开启 TPM 2.0 怎么办?

尽管 TPM 2.0 已经内置在许多新电脑中,但很多人并不知道如何激活这一功能,甚至完全忽略了它的存在。其实,只需简单的几步操作,你就能开启这项强大的安全特性,为你的数字生活增添一层坚固的防护屏障。无论你是普通用户还…...

QT之改变鼠标样式

QT改变鼠标图片 资源路径如下 代码实现 QPixmap customCursorPixmap(":/images/mouse.png");QCursor customCursor(customCursorPixmap);QWidget::setCursor(customCursor); // 可以设置为整个窗口或特定控件QWidget::setCursor(); // 设置为透明光标&#xff0c…...

Node IO操作

文章目录 Node IO操作概述流的基本类型可读流读取模式可读流状态创建可读流使用可读流暂停和恢复绑定可写流 可写流创建可写流使用可写流关闭流缓冲数据 可读可写流转换流 Node IO操作 概述 在 Node.js 中,I/O(输入/输出)操作是异步的&…...

零基础进阶人工智能——发展史、核心技术、前沿应用与未来展望

引言:从科幻走向现实,人工智能不再遥远 人工智能(AI),曾经是科幻小说和电影中遥不可及的未来科技,如今已悄然渗透到我们生活的方方面面。从智能家居的语音助手,到医疗诊断的辅助系统&#xff0…...

ue----git局域网内部署裸仓库,别的机器进行访问

最近由于经常迁移项目到另一台机器上进行部署更新一点就要整个迁移 弄得麻烦了 就在网上学了一下这个方式 首先我们在想要建立裸仓库的电脑上找到一个文件夹放置我们的裸仓库 在此点击鼠标右键选择 open git bash here 输入命令 创裸仓库 git init --bare gitTestName.git…...

三、tsp学习笔记——屏幕移植

泰山派-6寸猫屏转接板 - 立创开源硬件平台 泰山派樱猫的教程,屏资料链接: https://pan.baidu.com/s/1pNAKH33r7LtZG6EwHJ-HNA?pwdnsde 提取码: nsde (不要浪费时间下载,没有用,下载gitee上的) leefei/tspi-disp-6…...

vue3-05reactive定义对象类型的响应式数据(不能进行基本类型数据的响应式)

1.前言 reactive定义对象类型的响应式数据(不能进行基本类型数据的响应式) 2.实践 2.1语法 const 代理对象 reactive(源对象) 接收一个对象(或数组)&#xff0c;返回一个代理对象 (Proxy的实例对象&#xff0c;简称proxy对象) <script> import { reactive } from &qu…...

PaddlePaddle的OCR模型转onnx-转rknn模型_笔记4

一、PaddlePaddle的OCR模型转onnx 1、首先建立一个新的虚拟环境 conda create -n ppocr python3.10 -y conda activate ppocr 2、进入paddlepaddle官网输入以下指令安装paddlepaddle GPU版本 &#xff08;我的cuda版本是11.8,根据你电脑装合适版本&#xff09; pip instal…...

DeepSeek与ChatGPT的对比分析

一 概述 1 DeepSeek DeepSeek是杭州深度求索&#xff08;DeepSeek&#xff09;官方推出的AI助手&#xff0c;免费体验与全球领先AI模型的互动交流。总参数达到6710亿的DeepSeek-V3大模型&#xff0c;多项性能指标对齐海外顶尖模型&#xff0c;用更快的速度、更加全面强…...

OpenAI Swarm 多智能体框架介绍

目录 一、什么是 Swarm &#xff1f; 二、Swarn 使用方法 2.1 安装依赖 2.2 实例 本篇文章主要介绍下 OpenAI Swarm 多智能体框架。 一、什么是 Swarm &#xff1f; Swarm 是 OpenAI 开源的一款多智能体框架&#xff0c;但 OpenAI 对 Swarm 的定位是教育性、实验性的框架&…...

华大MCU HC32F005端口GPIO控制失效问题

1. 问题来源&#xff1a;RS485通信时&#xff0c;且数据量大、持续运行一段时间后&#xff0c;发现RS485使能引脚没有得到释放&#xff0c;导致总线锁死&#xff0c;无法通信&#xff0c;影响到整个总线的设备。 2. 问题分析&#xff1a;1&#xff09;经过测试和跟踪&#xff…...

Android今日头条的屏幕适配方案

今日头条的屏幕适配方案是一种基于动态调整设备密度&#xff08;density&#xff09;的适配方法&#xff0c;其核心原理是通过修改系统默认的屏幕密度参数&#xff0c;使得不同分辨率和尺寸的设备能够按照设计图的尺寸比例显示界面元素。以下是其核心原理与实现细节的总结&…...

抓包工具是什么?

抓包工具是一种用于捕获和分析网络数据包的软件或硬件设备。它可以帮助用户监控网络通信过程&#xff0c;查看网络中传输的数据内容、协议类型、源地址、目的地址等信息。以下是关于抓包工具的一些详细解释&#xff1a; 1. 主要功能 捕获数据包&#xff1a;抓包工具能够实时捕…...

微信小程序消息推送解密

package com.test.main.b2b;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.util.Arrays;/*** author * version 1.0* description: 解谜微信小…...

【大模型系列篇】DeepSeek-R1如何通过强化学习有效提升大型语言模型的推理能力?

如何通过强化学习&#xff08;RL&#xff09;有效提升大型语言模型&#xff08;LLM&#xff09;的推理能力&#xff1f; 《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning》由DeepSeek-AI团队撰写&#xff0c;主要介绍了他们开发的第一代…...

企业存储系统

一、概述 数字经济 人类通过大数据&#xff08;数字化的知识与信息&#xff09;的识别—选择—过滤—存储—使用&#xff0c;引导、实现资源的快速优化配置与再生&#xff0c;实现经济高质量发展的经济形态。 产业互联网推动发展 企业开始进行数字化转型&#xff0c;将传统…...

数据结构系列一:初识集合框架+复杂度

前言 数据结构——是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是计算机专业的基础课程&#xff0c;但也是一门不太容易学好的课&#xff0c;它当中有很多费脑子的东西&#xff0c;之后在学习时&#xff0c;你若碰到了困惑或不解的地方 都是很正常的反应&…...

【AI】GitHub Copilot

GitHub Copilot 是一款由 GitHub 和 OpenAI 合作开发的 AI 编程助手&#xff0c;它可以在多种开发工具中使用。以下是 GitHub Copilot 支持的主要开发工具和平台&#xff1a; 1. Visual Studio Code (VS Code) 官方支持&#xff1a;GitHub Copilot 在 VS Code 中拥有最完整的集…...

Linux系统编程学习 NO.14——缓冲区的概念、模拟实现Cstdio库

用户缓冲区 先介绍一下关于用户缓冲区的周边知识。 fread和fwrite的返回值 谈一谈fread和fwrite的返回值&#xff0c;如果写入/读取文件成功&#xff0c;fread或fwrite的返回值指的是实际写入/读取的内存块数量(实际的nmemb的大小)。假如fwrite写入的size是5字节&#xff0c;…...

Linux性能监控工具汇总

文章目录 前言一、性能监控工具介绍1.概念介绍2.常用组合方式3.对比 二、sar工具1.sar安装2.sar工具参数3.sar工具使用示例3.1.每两秒采集一次cpu使用情况&#xff0c;总计采集2次,然后输出CPU使用情况的统计信息3.2.磁盘IO使用情况统计3.3.内存使用情况统计3.4.网卡流量使用情…...

某手sig3-ios算法 Chomper黑盒调用

Chomper-iOS界的Unidbg 最近在学习中发现一个Chomper框架&#xff0c;Chomper 是一个模拟执行iOS可执行文件的框架&#xff0c;类似于安卓端大名鼎鼎的Unidbg。 这篇文章使用Chomper模拟执行某手的sig3算法&#xff0c;初步熟悉该框架。这里只熟悉模拟执行步骤以及一些常见的…...

MySQL版本选择与安装

MySQL版本选择与安装 MySQL 5.5 优点: 稳定性&#xff1a;5.5版本是长期支持&#xff08;LTS&#xff09;版本&#xff0c;因此它非常稳定&#xff0c;被广泛部署在生产环境中。 兼容性&#xff1a;与旧版本的MySQL和各种应用程序有很好的兼容性。 缺点: 过时&#xff1a;…...

【飞行器原理学习】——1. 机翼及机翼参数

飞行器原理学习——1.机翼 一、 概述 飞机的各种机翼是飞机的控制面 通过铰链、钢索、液压等方式连接在机身上 操纵面运动时&#xff0c;会改变机翼的弧度和形状&#xff0c;使流经的空气发生偏转&#xff0c;从而影响空气动力的大小。使飞机围绕着3轴运动 二、机翼的操纵面…...

TS语言自定义脚手架

初始化 新建文件夹初始化命令 npm init -ytsc --initnpm i types/nodenpm i typescript# 处理别名npm i -D tsc-alias -y 表示选项都为yes 安装ts相关依赖 新建相关文件 bin 文件夹 src文件夹 commands 文件夹 &#xff08;命令 utils 文件夹 (封装方法&#xff09; index.t…...