SpringSecurity中注解讲解
文章目录
- 1 @EnableGlobalMethodSecurity
- 1.1 @PreAuthorize
- 1.1.1 开启注解
- 1.1.2 使用注解原生方法
- 1.1.3 使用注解自定义方法
- 1.2 @PostAuthorize
- 1.3 @Secured
- 2 其他注解
- 2.1 @PostFilter
- 2.2 @PreFilter
- 3 权限表达式
1 @EnableGlobalMethodSecurity
@EnableGlobalMethodSecurity
是 Spring Security
中的一个注解,用于启用全局方法安全性。
其中属性prePostEnabled
和securedEnabled
都是它的属性,分别表示是否允许使用@PreAuthorize
和@Secured
注解来控制方法的访问权限。
当prePostEnabled
为true
时,表示允许使用@PreAuthorize
和@Secured
注解来控制方法的访问权限;当securedEnabled
为true
时,表示允许使用@Secured
注解来控制方法的访问权限。
点击此处了解 SpringSecurity和JWT实现认证和授权
1.1 @PreAuthorize
@PreAuthorize
是 Spring Security
提供的注解之一,用于在方法执行之前进行权限验证。通过使用 @PreAuthorize
注解,可以在方法级别对用户的权限进行校验,只有具备相应权限的用户才能执行被注解的方法。
@PreAuthorize
注解会在方法执行前进行权限验证,支持Spring EL
表达式,它是基于方法注解的权限解决方案
1.1.1 开启注解
在SpringSecurity
配置类上添加 @EnableGlobalMethodSecurity(prePostEnabled = true)
注解,以开启方法级别的权限验证,并支持 @PreAuthorize
注解。
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {}
1.1.2 使用注解原生方法
在方法上添加 @PreAuthorize
注解:找到需要进行权限验证的方法,在方法上添加 @PreAuthorize
注解,并指定相应的权限表达式
@PreAuthorize
注解支持丰富的权限表达式,可以根据具体的需求进行配置。例如,可以使用 hasRole('ROLE_ADMIN')
来验证用户是否具备指定角色,或者使用 hasAuthority('PERMISSION_ADD_USER')
来验证用户是否具备指定权限。
通过使用 @PreAuthorize
注解,可以对方法进行细粒度的权限控制,确保只有授权的用户才能执行对应的方法。
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void adminOnlyMethod(){}
1.1.3 使用注解自定义方法
@GetMapping("/{reportId}" )
@PreAuthorize("@test.hasPermission('archsys_sysarchreport_view')" )
public R getById(@PathVariable("reportId" ) Long reportId) {return R.ok(sysArchReportService.getById(reportId));
}
@PreAuthorize("@test.hasPermission('archsys_sysarchreport_view')" )
test
:是一个注册在Spring
容器中的Bean
,对应的类是 cn.test.PermissionService;
hasPermission
是PermissionService
类中定义的方法;
当Spring EL 表达式返回TRUE,则权限校验通过;
PermissionService.java的定义如下:
@Service("test")
public class PermissionService { public boolean hasPermission(String... permissions) {if (ArrayUtil.isEmpty(permissions)) {return false;}Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if (authentication == null) {return false;}Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();return authorities.stream().map(GrantedAuthority::getAuthority).filter(StringUtils::hasText).anyMatch(x -> PatternMatchUtils.simpleMatch(permissions, x));}}
1.2 @PostAuthorize
在方法执行后再进行权限校验,适合验证带有返回值的权限
先要开启注解功能
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {}
使用
@PostAuthorize("hasAnyAuthority('write')")
@RequestMapping(value = "/testPostAuthorize")
@ResponseBody
public String postAuthorize() {System.out.println("方法进入了。。。。");return "preAuthorize";
}
1.3 @Secured
判断是否具有角色,注意这里匹配的字符串需要添加前缀ROLE_
开启注解功能
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {}
在控制器方法上添加注解
@Secured({"ROLE_read"})
@RequestMapping(value = "/testSecured")
@ResponseBody
public String testSecured() {return "testSecured";
}
2 其他注解
2.1 @PostFilter
@PostFilter
是Spring Security
框架中的一个注解,用于在请求处理之后对请求进行过滤。
该注解可以应用于方法级别或类级别,用于指定只有满足特定条件的请求才能通过过滤器。例如,我们可以使用@PostFilter
注解来限制只有经过身份验证的用户才能访问某个接口。
在方法级别上,@PostFilter
注解的语法如下:
@RestController
public class MyController {@PostFilter("hasRole('ADMIN')")@GetMapping("/admin")public String admin() {// ...}
}
其中,hasRole('ADMIN')
是一个预定义的条件表达式,表示只有拥有ADMIN
角色的用户才能访问该方法。如果用户没有该角色,则无法访问该方法。
2.2 @PreFilter
进入控制器之前对数据进行过滤
@PreFilter
是 Spring Security
框架中的一个注解,用于在请求处理之前
对请求进行过滤。
该注解可以应用于方法级别或类级别,用于指定只有满足特定条件的请求才能通过过滤器。例如,我们可以使用@PreFilter
注解来限制只有拥有特定角色的用户才能访问某个接口。
在方法级别上,@PreFilter注解的语法如下:
@RequestMapping("/getTestPreFilter")
@PreFilter("hasRole('ADMIN')")
@ResponseBody
public List<UserPO> getTestPreFilter(@RequestBody List<UserPO> list) {list.forEach(t -> {System.out.println(t.getId() + "\t" + t.getUsername());});return list;
}
3 权限表达式
在Spring Security
中,权限表达式
是一种控制访问权限的方式。它可以通过方法级别的注解@PreAuthorize
、@PostAuthorize
、@PreFilter
和@PostFilter
来实现。其中,@PreAuthorize
和@PostAuthorize
注解用于控制方法级别
的访问权限,而@PreFilter
和@PostFilter
注解用于控制请求级别
的过滤。
除了这些注解之外,Spring Security
还提供了一些其他的注解和类来实现权限控制。例如,可以使用WebExpressionVoter
类来解析权限表达式,并根据表达式的结果来判断用户是否拥有对应的权限。此外,还可以使用SecurityExpressionRoot
类来构建表达式,并将其应用于URL路径或方法上。
相关文章:
SpringSecurity中注解讲解
文章目录 1 EnableGlobalMethodSecurity1.1 PreAuthorize1.1.1 开启注解1.1.2 使用注解原生方法1.1.3 使用注解自定义方法 1.2 PostAuthorize1.3 Secured 2 其他注解2.1 PostFilter2.2 PreFilter 3 权限表达式 1 EnableGlobalMethodSecurity EnableGlobalMethodSecurity 是 Sp…...

朔雪流量复制器的前端
朔雪流量复制器的前端 1. 功能需求简介 本流量复制器使用端口映射模式实现流量复制,可以实现一对一,一对多,和多对一的流量复制模式。 映射网口的多少取决于设备的硬件,最多可以支持36端口。 使用模式包括** 1)从1…...
Anaconda下 Prophet的安装,pystan和fbprophet的版本问题
一、安装pystan conda install pystan2.19.1.1 二、安装fbprophet conda install fbprophet0.7.1 -c conda-forge Prophet有prophet和fbprophet两个包可以安装,我这里用的是fbprophet 三 import fbprophet 后会提示: ERROR:fbprophet:Importing p…...
IntelliJ IDEA 简介
IntelliJ IDEA 简介 IntelliJ IDEA(简称 IDEA)是一款由 JetBrains 公司开发的强大且广受欢迎的集成开发环境(IDE),主要用于Java开发,但也支持其他编程语言和技术栈的开发。作为一款功能丰富、高效的IDE&am…...

20230904 QT客户端服务器搭建聊天室
Ser cpp#include "app.h" #include "ui_app.h"APP::APP(QWidget *parent):QWidget(parent),ui(new Ui::APP) {ui->setupUi(this);this->resize(550,400);ui->Line->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中ui->Line->se…...
吴恩达gradio课程:基于开源LLM(large language model)的聊天应用chatbot
文章目录 内容简介构建应用程序使用gradio在线体验接下来结合llm模型使用gradio构建一个完整的应用程序内容简介 Falcon 40B是当前最好的开源语言模型之一。使用text-generation库调用Falcon 40B的问答API接口。首先仅仅在代码中与模型聊天,后续通过Gradio构建聊天界面。Gradio…...
【c++】weak_ptrshared_ptr
目录 weak_ptr&shared_ptr 为什么不直接使用this指针 weak_ptr&shared_ptr weak_ptr<RtspSession> weakSelf dynamic_pointer_cast<RtspSession>(shared_from_this()); 这段代码涉及到 C 中的 weak_ptr 和 shared_ptr 的使用,以及类型转换…...
Init函数和main函数
1.Init函数和main函数 1.1. init函数 go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性。 有下面的特征: 1 init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等2 每个包可以拥有多个init函数3 包的…...

汇川PLC学习Day1:跑马灯程序编写
汇川PLC学习Day1:跑马灯程序编写 一、 软件安装 进入官网下载软件 二、 使用帮助 三、 新建工程与功能代码实现 CtrlN 寻找内带输出模块的CPU并设置好工程名字与保存路径,语言选择想熟悉的类型 工程建立后,PLC_PRG即为用户编写程序文件…...
【已解决】Unknown initial character set index ‘45‘ received from server
出现这个数据库连接异常,可能是数据库太新,所以更新一下JDBC连接驱动,原来的是5.0.4 ,现在换成5.1.47.连接成功。 参考其他博主的文章:Java——连接数据库MySQL 5.7和8.0的区别_这段语句mysql5.7和8.0有什么区别url: …...

Java从入门到精通-数组(二)
4.数组的基本操作 数组的基本操作包括遍历数组、填充替换数组元素、对数组进行排序、复制数组以及查询数组中的元素。 • 4.1 遍历数组 遍历数组是访问数组中所有元素的过程,通常使用循环完成。 使用 for 循环遍历数组: int[] numbers {1, 2, 3, 4…...
深入剖析HTTP和HTTPS代理在爬虫中的应用价值
在当今信息时代,数据是无处不在且极其宝贵的资源。对于从互联网上获取大量结构化或非结构化数据的需求而言,网络爬虫成为一种强有力的工具。然而,在实际操作过程中,我们常常会面临许多挑战和限制。 其中一个主要问题就是目标网…...
SQL语句分类及编写规范
目录 1.SQL分类 数据定义语言 DDL 数据操纵语言 DML 数据查询语言 DQL 数据控制语言 DCL 事务控制语言 TCL 2.SQL语句的编写规范 SQL语句不区分大小写 SQL语句关键词建议大写 SQL语句每句话用分号结尾 MySQL从小白到总裁完整教程目录:https://blog.csdn.net/wei…...
02-zookeeper分布式锁案例
1 Zookeeper分布式案例 1.1 Zookeeper分布式锁原理 核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点。 当我们假设根节点/ 下有/locks节点时 1)客户端获取锁时,在locks节点下创建临时顺序…...
【Spring传播机制底层原理】
一、Spring的事务传播机制 Spring的事务传播机制是Spring框架中最核心的机制之一,它能够灵活地控制多个事务方法的执行顺序、提交或回滚等行为。在Spring中,事务是通过TxManager来管理的,TxManager是一个接口,提供了开启、提交、…...

python通过tkinter制作词云图工具
一、基本功能 1.采取上传文本文档(仅支持.txt格式)的方式统计词频 2.背景图形样式可选择已经设定好的,也可选择本地上传的(支持.png .jpg .jpeg格式) 3.本地上传的图片需要进行抠图处理,并将抠图结果保存…...

Java-钉钉订阅事件
文章目录 背景什么是钉钉订阅事件钉钉订阅事件的应用场景 整体思路查看钉钉文档 什么是钉钉回调钉钉回调具体实操创建自己的应用钉钉回调开发过程中遇到的问题 总结 背景 最近需要做一个业务:钉钉组织架构下添加人员之后,要对该人员的数据信息做一个处理…...

【DataV/echarts】vue中使用,修改地图和鼠标点击部分的背景色
引入:使用 DataV 引入地图的教程是参考别人的,主要介绍修改地图相关的样式; 引入地图 是参考别人的,这里自己再整理一遍,注意需要安装 5 版本以上的 echarts; DataV 网址:https://datav.aliyun.…...
系统设计类题目汇总四
25 十个异步入库任务,如何保证他们原子入库? 了解了你的问题背景,确保10个异步入库任务原子性执行(即要么全部成功,要么全部失败)有以下几种方法: 数据库事务: 如果所有的入库操作都是在同一个…...

【C++心愿便利店】No.5---构造函数和析构函数
文章目录 前言一、类的6个默认成员函数二、构造函数三、析构函数 前言 👧个人主页:小沈YO. 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C 心愿便利店 🔑本章内容:类…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...