Spring Security中@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter

SpringSecurity方法安全:@PreAuthorize与SpEL表达式 方法级安全是Spring Security的核心特性之一,它允许开发者在方法执行前、执行后甚至执行过程中应用安全控制。与基于URL的安全控制相比,方法级安全提供了更细粒度的访问控制机制,特别适合复杂业务场景下的权限管理需求。方法级安全可以基于用户角色、权限、方法参数甚至是返回值进行控制,使得安全规则能够与业务逻辑紧密结合。要启用Spring Security的方法级安全,需要在配置类上添加@EnableMethodSecurity注解。 阅读详情

一、Spring Security 可以通过表达式控制方法权限

Spring Security 定义了四个支持使用表达式的注解,分别是@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter。
其中前两者可以用来在方法调用前或者调用后进行权限检查,后两者可以用来对集合类型的参数或者返回值进行过滤。
要使它们的定义能够对方法的调用产生影响,需要设置global-method-security元素的pre-post-annotations=”enabled”,默认为disabled:
<security:global-method-security pre-post-annotations="disabled"/>

二、使用@PreAuthorize和@PostAuthorize进行访问控制

@PreAuthorize可以用来控制一个方法是否能够被调用。
@PostAuthorize是在方法调用完成后进行权限检查,它不能控制方法是否能被调用,只能在方法调用完成后检查权限决定是否要抛出AccessDeniedException。

@Service
public class UserServiceImpl implements UserService {
   @PreAuthorize("hasRole('ROLE_ADMIN')")
   public void addUser(User user) {
      System.out.println("addUser................" + user);
   }
   @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
   public User find(int id) {
      System.out.println("find user by id............." + id);
      return null;
   }
}

代码中定义了只有拥有角色 ROLE_ADMIN 的用户才能访问 adduser(),而访问 find() 限定为有 ROLE_USER 角色或 ROLE_ADMIN 角色即可。使用表达式时还可以在表达式中使用方法参数:

public class UserServiceImpl implements UserService {
   //限制只能查询Id小于10的用户
   @PreAuthorize("#id<10")
   public User find(int id) {
      System.out.println("find user by id........." + id);
      return null;
   }
   // 限制只能查询自己的信息
   @PreAuthorize("wg.username.equals(#username)")
   public User find(String username) {
      System.out.println("find user by username......" + username);
      return null;
   }
   //限制只能新增用户名称为abc的用户
   @PreAuthorize("#user.name.equals('abc')")
   public void add(User user) {
      System.out.println("addUser............" + user);
   }
}

代码中定义了调用 find(int id) 时,只允许参数 id 小于 10 的调用;调用 find(String username) 时只允许 username 为当前用户的用户名;定义了调用 add() 时只有当参数 user 的 name 为 abc 时才可以调用。

有时候在方法调用完之后进行权限检查,这种情况比较少,但是 Spring Security 支持通过 @PostAuthorize 可以达到这一效果。使用 @PostAuthorize 时可以使用内置的表达式 returnObject 表示方法的返回值。

下面这一段示例代码:

@PostAuthorize("returnObject.id%2==0")
public User find(int id) {
   User user = new User();
      user.setId(id);
      return user;
}

代码表示在 find() 调用完成后进行权限检查,如果返回值的 id 是偶数则表示校验通过,否则表示校验失败,将抛出 AccessDeniedException。

三、使用 @PreFilter 和 @PostFilter 进行过滤

使用 @PreFilter 和 @PostFilter 可以对集合类型的参数或返回值进行过滤。使用 @PreFilter 和 @PostFilter 时,Spring Security 将移除使对应表达式的结果为 false 的元素。

 @PostFilter("filterObject.id%2==0")
  public List<User> findAll() {
      List<User> userList = new ArrayList<User>();
      User user;
      for (int i=0; i<10; i++) {
         user = new User();
         user.setId(i);
         userList.add(user);
      }
      return userList;
   }

代码表示对返回结果中 id 不为偶数的 user 进行移除。filterObject 是使用 @PreFilter 和 @PostFilter 时的一个内置表达式,表示集合中的当前对象。当 @PreFilter 标注的方法拥有多个集合类型的参数时,需要通过 @PreFilter 的 filterTarget 属性指定当前 @PreFilter 是针对哪个参数进行过滤的。

如下面代码就通过 filterTarget 指定了当前 @PreFilter 是用来过滤参数 ids 的。

@PreFilter(filterTarget="ids", value="filterObject%2==0")
public void delete(List<Integer> ids, List<String> usernames) {
      ...
}
Spring Security-@PreAuthorize 权限注解分析 @PreAuthorize @PreAuthorize 阅读详情

相关推荐

Spring Security 6.x 系列【68】 授权篇之基于注解 & 缓存的访问控制方案

通过之前授权篇的相关学习,我们了解到在登录时,会将用户的角色、权限值存储到对象中,当使用注解进行授权判断时,会从取出相关数据进行表达式计算。在某些场景下,特别是使用JWT认证方案时,如果将权限信息都封装在JWT中,JWT会变得很长很长,所以一般都会舍弃权限信息,只保存用户的基本信息。

记录知识、锤炼自我 4783

Method Security

 支持表达式的注解       Spring Security中定义了四个支持使用表达式的注解,分别是@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter。其中前两者可以用来在方法调用前或者调用后进行权限检查,后两者可以用来对集合类型的参数或者返回值进行过滤。要使它们的定义能够对我们的方法的调用产生影响我们需要设置global-method-sec...

qq_40800349的博客 424

从‘最长白列’到‘八邻域’:智能车图像巡线算法怎么选?我的踩坑经验分享

本文深入探讨了全国大学生智能汽车竞赛中图像巡线算法的选型与优化,对比了最长白列法、八邻域算法等五种主流方法的性能与适用场景。通过实战数据和代码示例,分析了各算法在直道、弯道及特殊赛道元素中的表现,并提供了内存优化、参数调整等实用技巧,帮助参赛团队提升智能车的巡线精度与效率。

weixin_30374009的博客 629

入门到精通:SpringBoot2和SpringSecurity5视频教程

<img src="https://img-bss.youkuaiyun.com/202003040840325012.jpg" alt="" />

STM32硬件SPI调试ADS1256的3个致命坑,CubeMX配置避坑指南

本文深入解析STM32硬件SPI调试ADS1256高精度ADC芯片时常见的3大配置陷阱,包括SPI时钟频率、时钟极性与相位、数据字节序等关键问题。通过CubeMX实战配置指南和实测数据对比,提供稳定可靠的解决方案,帮助开发者避免常见错误,提升采样精度和系统稳定性。

weixin_42550597的博客 346

卡门涡街可视化实战:从网格加密策略到动画后处理技巧

本文详细介绍了利用ANSYS Fluent进行卡门涡街可视化模拟的全流程,包括网格加密策略、求解器设置、涡街捕捉及动画后处理技巧。通过计算流体力学(CFD)方法,帮助工程师和研究人员高效模拟圆柱绕流现象,优化工程设计。

weixin_29309785的博客 414

spring security中@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter四者的区别

spring security中可以通过表达式控制方法权限: Spring Security中定义了四个支持使用表达式的注解,分别是@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter。其中前两者可以用来在方法调用前或者调用后进行权限检查,后两者可以用来对集合类型的参数或者返回值进行过滤。要使它们的定义能够对我们的方法的调用产生影响我们需要设置g...

灰太狼 13万+

【原创】SAP/Oracle 集团企业海外全球化实施注意事项: 一带一路本地化 (持续更新)...

ABC集团SAP的系统平台已经扩展到全球一百来个国家和地区,SAP系统平台的全球实施项目中, 当时是需要支持当地的业务和法律法规的合规要求。   当时客户也是缺乏当地的资源以及对当地法律法规和业务实践的了解,需要团队提供了全球化的支持,通过我们全球产品技术专家充分传递了各区域的本地化支持和实践 而且近年来我们发现一些国家和政府,陆续都在推出一些新的税改和合规的要求,接下来基于这些要求,我们全球...

weixin_34024034的博客 1143

spring security权限控制以及其中@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter四者的区别

spring security中可以通过表达式控制方法权限: Spring Security中定义了四个支持使用表达式的注解,分别是**@PreAuthorize**、@PostAuthorize、@PreFilter和@PostFilter。其中前两者可以用来在方法调用前或者调用后进行权限检查,后两者可以用来对集合类型的参数或者返回值进行过滤。要使它们的定义能够对我们的方法的调用产生影响我们需要设置global-method-security元素的pre-post-annotations=”enabled

weixin_46115725的博客 663

别只刷题了!我用834分经验告诉你,华为HCIP大数据考试(H13-723)这样准备更高效

本文分享了华为HCIP大数据认证(H13-723)834分通关的高效备考经验。通过分析考试动态、题库验证技巧和章节优先级策略,帮助考生超越单纯刷题,系统化掌握核心知识点。特别强调实时流处理和离线批处理等重点章节,提供黄金90分钟临场发挥策略,助力考生一次性通过考试。

weixin_38168786的博客 456

随机截距交叉滞后模型RI-CLPM:原理、Mplus实现与结果解读

纵向面板数据分析中,传统交叉滞后模型(CLPM)常被用于探索变量间的时序关系,但其估计结果可能混淆了个体间稳定差异与个体内短期波动,导致交叉滞后路径出现偏差。随机截距交叉滞后模型(RI-CLPM)通过引入随机截距因子,将个体特质层面的差异与个体内动态过程分离,从而提供更纯净的个体内效应估计。该模型在组织心理学、发展心理学、成瘾行为等研究领域迅速普及,并成为顶级期刊审稿时常见的稳健性检验要求。本文从原理出发,系统讲解RI-CLPM的模型构建、识别条件、Mplus实操代码、输出解读及常见陷阱,并结合协变量处理、

weixin_33525298的博客 269

postfilter_spring security中@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter四者的区别...

spring security中可以通过表达式控制方法权限:Spring Security中定义了四个支持使用表达式的注解,分别是@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter。其中前两者可以用来在方法调用前或者调用后进行权限检查,后两者可以用来对集合类型的参数或者返回值进行过滤。要使它们的定义能够对我们的方法的调用产生影响我们需要设置glo...

weixin_42355204的博客 237

【网络安全】零基础入门网络安全劝退指北

作为从16年接触网络安全的小白,谈谈零基础如何入门网络安全,有不对的地方,请多多指教。 这些年最后悔的事情莫过于没有把自己学习的东西积累下来形成一个知识体系。 后续我也会陆续的整理网络安全的相关学习资料及文章,与大家一起探讨学习。 如何入门 简单了解网络安全 网络安全就是指的确保网络系统中的数据不被别人破坏,而网安工程师就是涉及程序来维护网络安全。 网安方向有很多职位,比如安全产品工程师,安全分析师,数据恢复工程师,网络架构工程师,安全编程工程师,以及网络集成工程师等。 工作内容主要包括: 安全评测,风

互联网老辛 4580

用户授权中@Secured,@PreAuthorize,@PostAuthorize,@PreFilter,@PostFilter这五个注解的使用

文章目录用户授权中@Secured,@PreAuthorize,@PostAuthorize,@PreFilter,@PostFilter这五个注解的使用首选掌握几个英文单词的意思在哪里使用?给Spring Security开启注解@Secured注解@PreAuthorize注解(访问方法之前进行权限认证)@PostAuthorize注解(访问方法之后进行权限认证)@PostFilter注解@PreFilter注解 用户授权中@Secured,@PreAuthorize,@PostAuthorize,@P

xzy的博客 4035

产品缺陷检测:表面缺陷检测_(1).产品缺陷检测基础理论

确定像素之间的相似性准则,如灰度值的差异。

zhubeibei168的博客 832

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

5.Spring Security安全注解(@PreAuthorize、@PostAuthorize、@PostFilter、@PreFilter)

Spring Security默认是禁用注解的,要想开启注解,需要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解,并在该类中将AuthenticationManager定义为Bean如果要启用基于注解的方法安全性,要在配置类上使用**@EnableGlobalMethodSecurity**设置了securedEnabled = true,此时Spring将会创建一个切点,并将带有@Secured注解的方法防入切面中。

相互学习 共同进步 1774

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

springSecurity标签,特别是@PreAuthorize

spring security中可以通过表达式控制方法权限: @PreAuthorize @PostAuthorize @PreFilter @PostFilter 其中前两者可以用来在方法调用前或者调用后进行权限检查,后两者可以用来对集合类型的参数或者返回值进行过滤。 使用@PreAuthorize和@PostAuthorize进行访问控制 @PreAuthorize可以用来控制一个方法是否能够被调用 Controller层 /** * 根据用户编号获取详细信息 */

qq_37857224的博客 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring——Security安全框架之注解使用

文章目录前言本次测试注解介绍注解使用@Secured@PreAuthorize@PostAuthorize@PostFilter@PreFilter代码下载 前言 之前security中,针对配置项进行了相关的配置和测试。 但是这些都是基于在security.config.MyConfig#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)中进行对应请求的权限限制。 如果是多个请求,各个有

专注写bug 5970

SpringSecurity(二): @Secured、@PreAuthorize、@PostAuthorize、@PostFilter、@PreFilter注解说明

1. SpringSecurity注解说明 1.1 @Secured 判断是否具有角色,注意这里匹配的字符串需要添加前缀“ROLE_” 先要开启注解功能 @EnableGlobalMethodSecurity(securedEnabled = true) 在控制器方法上添加注解 @Secured({"ROLE_read"}) @RequestMapping(value = "/testSecured") @ResponseBody public String tes

qq_39198749的博客 1516

SpringSecurity中文文档(Servlet Method Security)

除了在请求级别进行建模授权之外,Spring Security 还支持在方法级别进行建模。然后,您可以立即使用@PreAuthorize、@PostAuthorize、@PreFilter 和@PostFilter 对任何 Spring 管理的类或方法进行注释,以授权方法调用,包括输入参数和返回值。SpringBootStarterSecurity 默认情况下不激活方法级授权。Method Security 还支持许多其他用例,包括 AspectJ 支持、自定义注释和几个配置点。

znjy111的博客 1716

Spring Security之EnableGlobalMethodSecurity注解详解

@EnableGlobalMethodSecurity 详解 @EnableGlobalMethodSecurity(securedEnabled=true) 开启@Secured 注解过滤权限 例如:@Secured({“ROLE_EMP”})、@Secured({“ROLE_EMP”, “ROLE_ROOT”})、@Secured({“ROLE_ROOT”}) @EnableGlobalMet...

Smiling Ron的博客 4321

Spring Security技术实战:通过注解表达式控制方法权限

Spring Security权限控制机制 Spring Security中可以通过表达式控制方法权限,其中有四个支持使用表达式的注解,分别是@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter。其中前两者可以用来在方法调用前或者调用后进行权限检查,后两者可以用来对集合类型的参数或者返回值进行过滤。 启动Security机制的配置 它们的定义能够对我们的方法的调用产生影响我们需要设置global-method-security元素的pre-post-a

wdj_yyds的博客 1711

SpringSecurity中 @EnableGlobalMethodSecurity作用及@PreAuthorize@PostAuthorize@PreFilter和@PostFilter四者的区别

spring security中可以通过表达式控制方法权限: Spring Security中定义了四个支持使用表达式的注解,分别是@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter。其中前两者可以用来在方法调用前或者调用后进行权限检查,后两者可以用来对集合类型的参数或者返回值进行过滤。要使它们的定义能够对我们的方法的调用产生影响我们需要设置global-method-security元素的pre-post-annotations=”enabled”.

z69183787的专栏 2609

一篇就会的Spring Security开发

修改 application.yml 文件spring:security:user:name: test # 通过配置文件,设置静态用户名password: test # 配置文件,设置静态登录密码。

cgblpx的博客 1379
上一篇: 优雅的全局异常处理
下一篇: @Autowired、@Resource、@Inject和@Service
JFS_Study
博客等级 码龄6年 363粉丝 359原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值