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();
}

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

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

相关文章

【iOS】SwiftUI状态管理

State ObservedObject StateObject 的使用 import SwiftUIclass CountModel: ObservableObject {Published var count: Int 0 // 通过 Published 标记的变量会触发视图更新init() {print("TimerModel initialized at \(count)")} }struct ContentView: View {State…

跟着 Lua 5.1 官方参考文档学习 Lua (3)

文章目录 2.5 – Expressions2.5.1 – Arithmetic Operators2.5.2 – Relational Operators2.5.3 – Logical Operators2.5.4 – Concatenation2.5.5 – The Length Operator2.5.6 – Precedence2.5.7 – Table Constructors2.5.8 – Function Calls2.5.9 – Function Definiti…

(LLaMa Factory)大模型训练方法--监督微调(Qwen2-0.5B)

1、准备训练数据:SFT 的数据格式有多种,例如:Alpaca格式、OpenAI格式等。 #其中Alpaca格式如下:[{"instruction":"human instruction (required)","input":"human input (optional)",&qu…

Sojson高级加密技术科普

1. 引言 什么是Sojson? Sojson是一款用于JavaScript代码加密与混淆的工具,它能够有效保护前端代码的知识产权,避免开发者的心血被随意窃取。 为什么需要代码加密? 在当今的互联网环境下,代码被轻易复制、篡改或逆向…

自制简单的图片查看器(python)

图片格式:支持常见的图片格式(JPG、PNG、BMP、GIF)。 import os import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root rootself.root.…

【核心算法篇十三】《DeepSeek自监督学习:图像补全预训练方案》

引言:为什么自监督学习成为AI新宠? 在传统监督学习需要海量标注数据的困境下,自监督学习(Self-Supervised Learning)凭借无需人工标注的特性异军突起。想象一下,如果AI能像人类一样通过观察世界自我学习——这正是DeepSeek图像补全方案的技术哲学。根据,自监督学习通过…

Nginx下proxy_redirect的三种配置方式

Nginx中的proxy_redirect指令,用于修改代理服务器接收到的后端服务器响应中的重定向URL。在代理环境中,若后端返回的重定向URL不符合客户端需求,就用它调整。 语法 proxy_redirect default; proxy_redirect redirect replacement; proxy_…

使用DeepSeek+本地知识库,尝试从0到1搭建高度定制化工作流(自动化篇)

7.5. 配图生成 目的:由于小红书发布文章要求图文格式,因此在生成文案的基础上,我们还需要生成图文搭配文案进行发布。 原实现思路: 起初我打算使用deepseek的文生图模型Janus进行本地部署生成,参考博客:De…

HBuilderX中,VUE生成随机数字,vue调用随机数函数

Vue 中可以使用JavaScript的Math.random() 函数生成随机数,它会返回 0 到 1 之间的浮点数, 如果需要0到1000之前的随机数,可以对生成的随机数乘以1000,再用js的向下取整函数Math.floor() 。 let randNum Math.random(); // 生成…

Redis_基础

Redis 命令启动、配置密码 Redis是绿色软件,所以直接解压就能使用 配置文件为:redis.windows.conf 启动redis 服务: redis-server.exe redis.windows.conf启动客户端: redis-cli.exe默认没有给Redis配置密码,所以在…

网络通信基础:端口、协议和七层模型详解,网络安全零基础入门到精通实战教程!

一、端口和协议的概念 1.在网络技术中,端口(Port) 大致有两种意思: 一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。 二是逻辑意义上的端口&…

Bug:Goland debug失效详细解决步骤【合集】

Bug:Goland debug失效详细解决步骤【合集】 今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束。网上搜寻了大量文章,最后得以解决,特此在…

pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网

首先pycharm官网是这一个。我是在2025年2月16日9:57进入的网站。如果网站还没有更新的话,那么就往下滑一下找到 community Edition,这个就是社区版了免费的。PyCharm:适用于数据科学和 Web 开发的 Python IDE 适用于数据科学和 Web 开发的 Python IDE&am…

WordPress Ai插件:支持提示词生成文章和chat智能对话

源码介绍 适用于 WordPress 的 AI 助手开源免费插件展开介绍,包含插件功能、使用说明、注意事项等内容,为 WordPress 用户提供了一个集成多种 AI 模型的工具选择。 插件概述:插件名称为小半 WordPress AI 助手,支持多种 AI 模型&…

Spring Boot02(数据库、Redis)---java八股

数据库相关 Mybatis的优缺点 优点: 基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML 标签&am…

【LeetCode】LCR 139. 训练计划 I

题目 教练使用整数数组 actions 记录一系列核心肌群训练项目编号。为增强训练趣味性,需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组 形式返回。 示例 1: 输入:actions [1,2,3,4,5] 输出&#…

波导阵列天线 学习笔记9 使用紧凑高效率馈网的宽带圆极化阵列天线

摘要: 一种宽带圆极化波导阵列天线在本文中提出。所提出的阵列天线包括四个反向对称的(antipodally)脊单元和一个有着插入阶梯腔体的两个正交膜片的紧凑型馈网。两个器件都是宽带的并且它们能独立地或者一起工作。所提出的拓扑给出了一种为大规模阵列的基础的2x2波导…

【AI战略思考15】我对做自媒体视频博主的初步探索和一些思考

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 导言 因为自己找工作可能没那么快和顺利,事实是比我之前想象的要难很多,所以这几天探索了下自己能否尝试做自媒体或者视频博主来尝试赚点钱,如果做…

nodejs:express + js-mdict 网页查询英汉词典,能显示图片

向 DeepSeek R1 提问: 我想写一个Web 前端网页,后台用 nodejs js-mdict , 实现在线查询英语单词,并能显示图片 1. 项目结构 首先,创建一个项目目录,结构如下: mydict-app/ ├── public/ │ ├── …

【数据分析】2.数据分析业务全流程

业务流程方法论:3阶段6步骤 一、课程核心内容结构 1. 方法论概述 目标:系统性地解决商业中的关键问题框架:分为三个阶段,每个阶段包含两个步骤适用场景:适用于数据分析师、业务经理等需要通过数据分析支持决策的从业…