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 心愿便利店 🔑本章内容:类…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
