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

【Spring Security注解详解】

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的子类中,你通常会这样配置以启用方法级安全:

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

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

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

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

http://www.lryc.cn/news/348066.html

相关文章:

  • C++学习笔记3
  • 基于SpringBoot的酒店(预约)客房管理系统的设计与实现+毕业论文
  • Rust 中的声明可见性
  • 让 计算机 将 数学 公式 表达式 的计算过程绘制出来 【mathematical-expression(MAE)】
  • Django——中间件
  • 景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!
  • SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式
  • [muduo网络库]——muduo库的Reactor模型(剖析muduo网络库核心部分、设计思想)
  • vue中怎样清除computed的缓存
  • 代码大师的工具箱:现代软件开发利器
  • 整理好了!2024年最常见 100 道 Java基础面试题(四十三)
  • 【TypeScript模块简介以及使用方法】
  • Offer必备算法38_贪心算法四_八道力扣题详解(由易到难)
  • java8 转对象,Java8转Map,Java8转Llist
  • 【Pytest官方文档翻译及学习】2.1 如何调用pytest
  • RabbitMQ的用途
  • R语言软件安装及配置
  • 网络配置的加密存储
  • 你写代码,会关注时间复杂度吗?
  • 【连连国际注册/登录安全分析报告】
  • linux进阶高级配置,你需要知道的有哪些(10)-远程访问
  • 不显示 表格 style=“display: none;“ 这个默认是不显示的
  • Bittensor怎么挖?手把手教你,使用bitget钱包
  • 领略Java内部类的“内部”
  • PHP 提取数组中的特定的值
  • SpringBoot、JAVA中excel、rtf、doc转PDF
  • 生信技能45 - 基于docker容器运行生信软件
  • 算法训练营第63天|LeetCode 84.柱状图中最大的矩形
  • python跟C++选哪个?
  • 速锐得深入解析吉利几何CAN总线数据通信网络的拓扑层级框架技术