当前位置: 首页 > 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!";}// 更多使用示例...
}

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

相关文章:

【Spring Security注解详解】

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

C++学习笔记3

A. 求出那个数 题目描述 喵喵是一个爱睡懒觉的姑娘&#xff0c;所以每天早上喵喵的妈妈都花费很大的力气才能把喵喵叫起来去上学。 在放学的路上&#xff0c;喵喵看到有一家店在打折卖闹钟&#xff0c;她就准备买个闹钟回家叫自己早晨起床&#xff0c;以便不让妈妈这么的辛苦…...

基于SpringBoot的酒店(预约)客房管理系统的设计与实现+毕业论文

系统介绍 酒店客房管理系统为酒店管理者和用户、清洁人员提供一个在线管理酒店客房的系统。在网站的设计中&#xff0c;一共分为了两个模块设计&#xff0c;一个是前台模块&#xff0c;一个是后台模块&#xff0c;前台主要用于提供查看客房信息&#xff0c;酒店资讯&#xff0…...

Rust 中的声明可见性

Rust 中的声明可见性 在 Rust 编程语言中&#xff0c;声明可见性是一个核心概念&#xff0c;它决定了代码中的项&#xff08;如函数、结构体、枚举等&#xff09;在哪些范围内可以被访问。Rust 通过一套严谨的规则来控制这些可见性&#xff0c;以确保代码的安全性和封装性。下…...

让 计算机 将 数学 公式 表达式 的计算过程绘制出来 【mathematical-expression(MAE)】

目录 文章目录 目录介绍开始实战引入数学表达式计算库引入流程图代码生成库开始进行生成 介绍 大家好 今天我们来分享一个新知识&#xff0c;将数学表达式的整个计算过程&#xff0c;以及计算繁多结果在 Java 中绘制出来&#xff0c;计算机中的数学表达式计算的功能很常见了&a…...

Django——中间件

Django——中间件 中间件可以介入 Django 的请求和响应的处理过程&#xff0c;修改 Django 的响应数据。中间件的设计为程序开发者提供了一种无侵入式的开发方式&#xff0c;增强 Django 框架的健壮性。 中间件可以在 Django 处理视图的不同阶段的干预。 Django 框架中原先内…...

景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!

随着无人机技术的不断发展与革新&#xff0c;它已成为现代社会中一个前景无限的科技领域。 无人机应用领域 边境巡逻与安防&#xff1a;边境管理部门利用无人机监控边境线&#xff0c;防止非法越境和其他安全威胁&#xff0c;同时也能监控地面安保人员的工作状态和行动路线。 …...

SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式

SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式 1、对象使用Json序列化 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.data.r…...

[muduo网络库]——muduo库的Reactor模型(剖析muduo网络库核心部分、设计思想)

一、前言 在学习 C 服务端的过程中&#xff0c;必不可少的一项就是熟悉一个网络库&#xff0c;包括网络库的应用和其底层实现。我们熟知的网络库有 libevent、libev、muduo、Netty 等&#xff0c;其中 muduo 是由陈硕大佬个人开发的 TCP 网络库&#xff0c;最近跟着课程正在深…...

vue中怎样清除computed的缓存

vue中computed计算属性自带缓存&#xff0c;会提高程序的渲染性能&#xff0c;但根据业务需求以及相应的优化&#xff0c;可能要清除computed的缓存&#xff0c;具体方法和场景分为了vue2和vue3 vue2&#xff1a; this.$delete(this.someObject, cachedProperty); 使用 this…...

代码大师的工具箱:现代软件开发利器

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

整理好了!2024年最常见 100 道 Java基础面试题(四十三)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 100 道 Java基础面试题&#xff08;四十二&#xff09;-CSDN博客 八十五、Java 常用的元注解有哪些&#xff1f; 在Java中&#xff0c;元注解&#xff08;Meta-Annotation&#xff09;是指那些用于其他注解上的注解&…...

【TypeScript模块简介以及使用方法】

TypeScript模块简介 TypeScript中的模块&#xff08;Modules&#xff09;是代码的封装体&#xff0c;它们可以包含变量、函数、类和接口等。在TypeScript中&#xff0c;模块可以被其他模块引用和使用&#xff0c;从而实现代码的复用和模块化开发。 TypeScript支持两种模块系统…...

Offer必备算法38_贪心算法四_八道力扣题详解(由易到难)

目录 ①力扣56. 合并区间 解析代码 ②力扣435. 无重叠区间 解析代码 ③力扣452. 用最少数量的箭引爆气球 解析代码 ④力扣397. 整数替换 解析代码1_递归改记忆化搜索 解析代码2_贪心策略 ⑤力扣354. 俄罗斯套娃信封问题 解析代码1_动态规划&#xff08;超时&#xf…...

java8 转对象,Java8转Map,Java8转Llist

1.准备数据 public static List<Persion> getData(){List<Persion> arrayList new ArrayList<>();arrayList.add(new Persion("李四","20","男"));arrayList.add(new Persion("王麻子","30","男&q…...

【Pytest官方文档翻译及学习】2.1 如何调用pytest

目录 2.1 如何调用pytest 2.1.1 指定要运行的测试 2.1.2 获取有关版本、选项名称、环境变量的帮助 2.1.3 分析测试执行时间 2.1.4 管理加载插件 2.1.5 调用pytest的其他方式 2.1 如何调用pytest 2.1.1 指定要运行的测试 Pytest支持几种从命令行运行和选择测试的方法。、…...

RabbitMQ的用途

RabbitMQ主要有四个用途&#xff0c;分别是应用解耦、异步提速、削峰填谷、消息分发。详情讲解如下&#xff1a; RabbitMQ介绍、解耦、提速、削峰、分发 详解、RabbitMQ安装 可视化界面讲解 1.应用解耦&#xff1a;提高系统容错性和可维护性 2.异步提速&#xff1a;提升用户体验…...

R语言软件安装及配置

1、下载 网址&#xff1a;www.r-project.org 1.1 下载R 选择download R 选择清华源进行下载 根据自己系统情况下载&#xff0c;我选择windows系统。 先选择base。 选择最新的版本下载。 1.2 下载RTools 下载好后&#xff0c;返回&#xff0c;选择RTools进入后&#xff0c;选…...

网络配置的加密存储

随着数据泄露事件的增加&#xff0c;扰乱了公司的正常工作周期&#xff0c;企业遭受了损失。事实上&#xff0c;数据泄露可以通过存储加密来控制&#xff0c;存储加密是防止黑客对网络数据库造成严重破坏的最有效方法之一。在网络配置管理器中&#xff0c;存储加密可用于存储设…...

你写代码,会关注时间复杂度吗?

虽然面试的时候总是被问到这个问题&#xff0c;但你写代码的时候&#xff0c;真的会想到这个问题吗&#xff1f;时间复杂度&#xff0c;说的当然不是你写的代码执行用了多长时间&#xff0c;而是代码执行语句的次数。 目录 每行代码都需要注意 计算方法 1 例如常量增长 2 …...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...