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

@PreAuthorize与@Secured注解的区别是什么?

@PreAuthorize@Secured都是Spring Security中的注解,它们用于方法安全,即定义哪些用户有权限调用特定的方法。尽管它们的目的相同,但是它们提供了不同的功能和表达方式。

@PreAuthorize

@PreAuthorize注解在方法调用之前进行安全检查,它支持Spring Expression Language (SpEL)表达式,这使得你可以编写更复杂的安全条件。

例如,你可以检查用户是否拥有特定的角色:

@PreAuthorize("hasRole('ROLE_USER')")
public void methodOnlyForUsers() {// 方法内容
}

或者更复杂的条件,比如基于方法参数的动态安全表达式:

@PreAuthorize("#userId == authentication.principal.id")
public void methodForSpecificUser(Long userId) {// 方法内容
}

在上面的例子中,只有当方法参数userId与认证对象中的当前用户ID相同,方法才能被调用。

@Secured

@Secured注解也是用来定义方法的安全约束,但是它不支持SpEL表达式,只能指定角色名称。如果用户没有满足注解内指定的角色之一,方法调用会被拒绝。

@Secured("ROLE_USER")
public void someUserMethod() {// 方法内容
}

你可以传递一个角色数组,如果用户具有列出的任何一个角色,那么他们可以访问方法:

@Secured({"ROLE_USER", "ROLE_ADMIN"})
public void methodForUsersAndAdmins() {// 方法内容
}

主要区别

  1. 表达式支持:

    • @PreAuthorize可以使用SpEL表达式进行复杂的操作。
    • @Secured只能指定角色名称,不能使用表达式。
  2. 使用灵活性:

    • @PreAuthorize更加灵活,能够实现复杂的安全规则。
    • @Secured更加简洁明了,适合简单的角色检查。
  3. 配置:

    • 在Spring Security配置中启用@PreAuthorize时,你需要使用.prePostEnabled(true)
    • 启用@Secured时使用.securedEnabled(true)

举个例子,如果你想要在方法执行之前检查用户是否具有某个特定的权限,并且还要检查一些动态条件,@PreAuthorize会更适合这种复杂的场景。另一方面,如果你只需要简单地限制方法的访问到特定角色,那么使用@Secured可能更加合适和直接。

相关文章:

  • 【Java】已解决java.net.HttpRetryException异常
  • html侧导航栏客服栏
  • 【Nprogress】页面跳转进度条
  • 广告联盟流量变现app开发
  • 搜索进入AI蓝海时代:谁在成为新玩家?
  • 小程序项目业务逻辑回忆1
  • 赶紧收藏!2024 年最常见 20道设计模式面试题(九)
  • 【机器学习300问】129、RNN如何在情感分析任务中起作用的?
  • 信息技术课如何禁止学生玩游戏
  • 【Gradio】Custom Components | Gradio组件关键概念 后端
  • 9.2JavaEE——JDBCTemplate的常用方法(一)excute()方法
  • GenICam标准(三)
  • 【全开源】沃德会务会议管理系统(FastAdmin+ThinkPHP+Uniapp)
  • 自然语言NLP的基础处理
  • VBA学习(13):获取多层文件夹内文件名并建立超链接
  • @jsonView过滤属性
  • 5、React组件事件详解
  • Angular6错误 Service: No provider for Renderer2
  • EventListener原理
  • exports和module.exports
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript-Array类型
  • JavaScript对象详解
  • Java读取Properties文件的六种方法
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Nacos系列:Nacos的Java SDK使用
  • Python学习笔记 字符串拼接
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • SwizzleMethod 黑魔法
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 浮现式设计
  • 前端面试之CSS3新特性
  • 如何用vue打造一个移动端音乐播放器
  • 使用putty远程连接linux
  • 手写一个CommonJS打包工具(一)
  • 你对linux中grep命令知道多少?
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • const的用法,特别是用在函数前面与后面的区别
  • 回归生活:清理微信公众号
  • 如何正确理解,内页权重高于首页?
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (C语言)字符分类函数
  • (k8s)Kubernetes本地存储接入
  • (SERIES12)DM性能优化
  • (void) (_x == _y)的作用
  • (八)Flask之app.route装饰器函数的参数
  • (补)B+树一些思想
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)