【Spring Security注解详解】

server/2024/9/22 17:59:07/

Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架,广泛用于Java应用程序中以确保安全。它提供了多种注解来简化安全控制的实现,特别是在方法级别的权限控制上。以下是几个核心的Spring Security注解及其用途的详细介绍:

1. @EnableWebSecurity

  • 作用: 该注解用于启动Spring Security的配置。当你在配置类上使用它时,Spring会自动扫描并应用安全配置。这是配置Spring Security的基础步骤。

2. @EnableGlobalMethodSecurity

  • 作用: 用于开启方法级别的安全检查。它允许你在方法或类级别上使用其他安全相关的注解,如@PreAuthorize, @PostAuthorize, @Secured等。这个注解有几个可配置的属性,比如:
    • prePostEnabled=true 启用@PreAuthorize@PostAuthorize注解。
    • securedEnabled=true 启用@Secured注解。
    • jsr250Enabled=true 启用JSR-250注解,如@RolesAllowed

3. @PreAuthorize

  • 作用: 该注解用于方法执行前的权限检查。它可以包含SpEL(Spring Expression Language)表达式,用于动态地决定用户是否有权访问该方法。例如,@PreAuthorize("hasRole('ADMIN')")会检查用户是否拥有’ADMIN’角色。

Spring Expression Language (SpEL) 是Spring框架内置的一种强大的表达式语言,它为在运行时查询和操作对象图提供了强大的能力。SpEL在Spring的多个组件中都有广泛的应用,包括但不限于Spring Security中的权限控制、Spring Integration的消息路由、Spring Data的查询条件定义等。以下是对SpEL表达式的详细介绍:

基本概念

  • 目的: SpEL的主要目的是提供一种简洁、灵活的方式来访问和操作应用程序上下文中的对象属性、方法以及执行逻辑运算。

  • 语法: SpEL表达式通常被包含在#{}内,例如#{someObject.property}。但具体使用时,根据上下文不同,可能不需要花括号,如在某些Spring Security注解中。

基本用法

  1. 访问属性: 基本的属性访问表达式形如person.name,其中person是对象引用,name是属性名。

  2. 方法调用: 可以直接调用对象的方法,如@PreAuthorize("@ss.hasPermi('system:config:list')")中调用了ss对象的hasPermi方法。

  3. 算术运算: 支持加减乘除、取模等基本运算,如#{2+3}

  4. 逻辑运算: 包括and, or, not等,例如#{age >= 18 and age <= 60}

  5. 条件表达式: 类似于编程语言中的三元运算符,如#{person.age > 18 ? 'adult' : 'minor'}

高级特性

  1. 类型转换: SpEL自动处理基本类型的转换,也可以显式转换,如T(String).valueOf(123)将整数转换为字符串。

  2. 集合操作: 支持遍历、筛选、投影等操作集合的方法,如#{names.?[length() > 5]}筛选出长度大于5的字符串。

  3. 安全访问: 可以限制表达式的执行环境,避免潜在的安全风险,如只允许读取操作。

  4. 内置函数: 提供了一系列内置函数,如#sqrt(x)计算平方根,#arrays处理数组等。

  5. 上下文变量: 在表达式中可以直接引用由外部提供的变量,如方法参数、Spring Bean等。

示例

  • 访问Bean属性: #{systemProperties['os.name']} 获取操作系统名称。

  • 条件判断: @PreAuthorize("hasRole('ADMIN') or hasRole('MODERATOR')") 检查用户是否有管理员或版主角色。

  • 集合筛选: #{users.?[age > 25]} 筛选出年龄大于25的用户。

总结

SpEL为开发者提供了一种在配置文件或注解中使用复杂逻辑的强大工具,极大地增强了Spring应用的灵活性和可配置性。通过掌握SpEL的基本语法和高级功能,可以有效地处理各种运行时的决策和数据操作需求。

4. @PostAuthorize

  • 作用: 与@PreAuthorize类似,但检查发生在方法执行之后。这允许基于方法返回的结果来决定访问权限。不常用,但在某些特定场景下非常有用。

5. @Secured

  • 作用: 一个更简单的注解,用于指定访问该方法所需的角色列表。它不像@PreAuthorize那样支持复杂的表达式,而是直接接受角色名称的数组。例如,@Secured({"ROLE_ADMIN", "ROLE_USER"})

6. @PreFilter 和 @PostFilter

  • 作用: 这两个注解用于数据过滤,分别在方法执行前后对返回集合进行过滤。它们可以基于SpEL表达式来决定哪些元素应该包含在结果集中。

使用示例

WebSecurityConfigurerAdapter的子类中,你通常会这样配置以启用方法级安全:

java">@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {// ... 其他配置 ...
}

然后,在你的服务类或控制器方法上使用这些注解:

java">@Service
public class MyService {@PreAuthorize("hasRole('USER')")public String someProtectedMethod() {return "Hello, User!";}// 更多使用示例...
}

这些注解为开发者提供了一种声明式的方法来管理权限,使得代码更加清晰和易于维护。


http://www.ppmy.cn/server/36029.html

相关文章

垂起固定翼+多旋翼无人机+集群组网:高低空域协同组网通信技术详解

垂起固定翼、多旋翼无人机与自组网的结合&#xff0c;为高低空域协同组网通信技术提供了创新的解决方案。这种结合充分利用了各种技术的优势&#xff0c;使得无人机在高低空域中的协同作业和通信更加高效和灵活。 首先&#xff0c;垂起固定翼无人机以其垂直起降能力和长航时的…

微搭低代码入门05文件的上传和下载

目录 1 创建数据源2 创建应用3 创建页面4 设置导航功能5 文件上传6 文件下载总结 小程序中&#xff0c;我们通常会有文件的上传和下载的需&#xff0c;在微搭中&#xff0c;文件是存放在云存储中&#xff0c;每一个文件都会有一个唯一的fileid&#xff0c;我们本篇就介绍如何通…

Kafka源码分析(五) - Server端 - 基于时间轮的延时组件

系列文章目录 Kafka源码分析-目录 一. 背景 Kafka内部涉及大量的"延时"操作&#xff0c;比如收到PRODUCE请求后可为副本等待一个timeout的时间后再响应客户端。 那我们讨论一个问题&#xff1a;Kafka为什么自己实现了一个延时任务组件&#xff0c;而不直接使用ja…

深度学习之基于Pytorch姿态估计的仰卧起坐计数系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 仰卧起坐作为一种常见的健身动作&#xff0c;被广泛用于腹部肌肉的锻炼。然而&#xff0c;对于仰卧起…

【SpringMVC 】什么是SpringMVC(二)?如何整合ssm框架以及使用mybatisPlus?

文章目录 SpringMVC第三章1、ssm整合1、基本步骤1-3步4-5步6步7步8-12步13步14-15步2、添加数据3、删除数据4、配置事务5、修改数据2、pageHelpe分页1、基本步骤第四章1、mybatisPlus1、基本步骤1-45-7892、基本方法的使用查询2、新ssm项目1、基本步骤1-5678-910-111213-15Spri…

SpringBoot-@Transactional注解失效

Transactional注解失效 Transactional失效场景 以下是一些常见导致Transactional注解失效的场景&#xff0c;配合相应的Java代码演示&#xff1a; 1、方法修饰符非公开&#xff08;非public&#xff09; Transactional注解失效的原因在于Spring事务管理器如何实现对事务的代…

【智能算法应用】麻雀搜索算法求解非线性方程组问题

目录 1.算法原理2.数学模型3.结果展示4.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.数学模型 非线性方程组为&#xff1a; 2 x 1 − x 2 e − x 1 − x 1 2 x 2 e − x 2 (1) \begin{aligned}&2x_1-x_2e^{-x_1}\\&-…

服务智能化公共生活场景人员检测计数,基于YOLOv5全系列参数模型【n/s/m/l/x】开发构建公共生活场景下人员检测计数识别系统

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;各种智能化系统已广泛应用于各个领域&#xff0c;特别是在人员密集、流动性大的场合&#xff0c;如商场、火车站、景区等&#xff0c;智能人员检测计数系统发挥着至关重要的作用。特别是在特殊时期&#xff0c;如节假日、…