Spring Security SecurityContextHolder(安全上下文信息)

在本篇博客中,我们将讨论 Spring Security 的 SecurityContextHolder 组件,包括其实现方式、关键特性,并通过实际示例进行说明。

理解 SecurityContextHolder

SecurityContextHolder 是 Spring Security 存储当前安全上下文详细信息的地方。这个上下文包括:

  • 当前已认证的用户
  • 用户的授予权限
  • 其他相关安全细节

SecurityContextHolder 在 Spring Security 的认证和授权过程中起着核心作用,使开发者能够在应用程序的任何地方访问用户的当前安全上下文。

SecurityContextHolder 的关键特性

  • 全局访问:它允许全局访问当前的认证详细信息。
  • 线程局部存储:默认情况下,它将认证详细信息存储在线程局部变量中,确保安全上下文隔离到各个线程。
  • 上下文传播:它支持安全上下文在不同线程间的传播,这对于异步处理至关重要。

SecurityContextHolder 的工作原理

SecurityContextHolder 使用 SecurityContext 来持有表示当前已认证用户的 Authentication 对象。Authentication 对象包含:

  • 主体(Principal)
  • 凭证(Credentials)
  • 授予权限(Granted Authorities)

当用户认证成功后,Spring Security 会更新 SecurityContextHolder 中的认证详细信息。在整个请求生命周期中,应用程序可以通过 SecurityContextHolder 访问这些认证详细信息,以便进行安全相关的决策。

存储安全上下文的策略

Spring Security 提供了几种存储安全上下文的策略:

  • MODE_THREADLOCAL:默认策略,将上下文存储在线程局部变量中。
  • MODE_INHERITABLETHREADLOCAL:支持子线程继承父线程的安全上下文。
  • MODE_GLOBAL:全局上下文,但由于潜在的安全风险,很少使用。

使用示例

示例 1:访问已认证用户的详细信息

一个常见的用例是在控制器或服务中访问已认证用户的详细信息,如用户名或角色。

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String username = authentication.getName();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();

这段代码从 SecurityContextHolder 中获取当前的 Authentication 对象,从而访问已认证用户的用户名和权限。

示例 2:手动设置认证信息

在某些情况下,您可能需要手动设置 SecurityContextHolder 中的 Authentication 对象,例如在测试或程序化认证时。

Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);

这里创建了一个新的 Authentication 对象,并将其设置到 SecurityContextHolder 中,从而在当前上下文中认证用户。

示例 3:使用认证信息保护方法

存储在 SecurityContextHolder 中的认证详细信息也可以用于保护方法,例如基于用户的角色限制方法的执行。

public void sensitiveAction() {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if (authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) {// 执行敏感操作} else {throw new AccessDeniedException("此操作仅限管理员执行。");}
}

此方法检查当前认证用户是否具有 ROLE_ADMIN 权限,然后决定是否执行敏感操作,利用 SecurityContextHolder 进行基于角色的访问控制。

结论

SecurityContextHolder 是 Spring Security 的核心组件之一,提供了管理已认证用户安全上下文的重要机制。其全局存储和访问认证详细信息的能力,使开发者能够构建安全、复杂的应用程序。

通过理解和有效利用 SecurityContextHolder 及其功能,您可以增强应用程序的安全模型,确保敏感操作和数据根据认证和授权原则得到保护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过vite+vue3+pinia从0到1搭建一个uniapp应用

最近项目上要做一个app&#xff0c;选择了用uniapp作为开发框架&#xff1b;我大概看了一下uniapp的文档&#xff0c;根据文档从0到1搭了一个uniapp应用供大家参考。 因为本人习惯使用了WebStorm编译器&#xff0c;但是uniapp官方推荐使用HBuilder搭建&#xff0c;如果和我一样…

【Pytorch】torch.nn.functional模块中的非线性激活函数

在使用torch.nn.functional模块时&#xff0c;需要导入包&#xff1a; from torch.nn import functional 以下是常见激活函数的介绍以及对应的代码示例&#xff1a; tanh (双曲正切) 输出范围&#xff1a;(-1, 1) 特点&#xff1a;中心对称&#xff0c;适合处理归一化后的数据…

java-贪心算法

1. 霍夫曼编码&#xff08;Huffman Coding&#xff09; 描述&#xff1a; 霍夫曼编码是一种使用变长编码表对数据进行编码的算法&#xff0c;由David A. Huffman在1952年发明。它是一种贪心算法&#xff0c;用于数据压缩。霍夫曼编码通过构建一个二叉树&#xff08;霍夫曼树&a…

【数据结构】【线性表】【练习】反转链表

申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c;图表等&#xff09;均原创&#xff0c;侵删&#xff01; 题目 给你单链表的头指针head以及两个整数left和right&#xff0c;其中left<right&#xff0c;请你反转从位置left到right的链表节点&…

实时数仓:Lambda架构和Kappa架构有什么联系和区别

Kappa 和 Lambda 架构是处理大数据和实时数据流的两种不同设计模式。以下是对这两种架构的概述和比较&#xff1a; Lambda 架构 定义&#xff1a; Lambda 架构的全称是 Lambda Architecture。这个架构旨在处理大规模数据&#xff0c;结合了批处理和流处理的优点&#xff0c;以…

vllm源码解析(一):整体架构与推理代码

vlllm官方代码更新频发,每个版本都有极大变动, 很难说哪个版本好用. 第一次阅读vllm源码是0.4.0版本,对这版圈复杂度极高的调度代码印象深刻 0.4.1对调度逻辑进行重构,完全大变样, 读代码速度快赶不上迭代的速度了。 现在已经更新到0.5.4, 经过长时间观察&#xff0c;发现主要的…

数据库index(索引)使用注释事项

1、索引类型&#xff0c;通常选择NORMAL或者UNIQUE. NORMAL&#xff1a;正常的一种索引吧。 UNIQUE:索引列必须是不能重复的。 2、索引方法&#xff1a;通常选择BTREE 3、使用SQL查询的时候&#xff0c;不需要特别处理索引的字段。数据库会自动的处理&#xff0c;提升SQL的查…

集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1

蓝牙模组 - RF-BM-2340B1是基于美国TI的CC2340R5为核心设计的一款SimpleLink 2.4 GHz 无线模块。支持Bluetooth 5.3 Low Energy、Zigbee 、IEEE 802.15.4g、TI 15.4-Stack (2.4 GHz)及私有协议。集成了高性能ARM Cortex-M0处理器&#xff0c;具有512 KB Flash、32 KB超低泄漏SR…

[QDS]从零开始,写第一个Qt Design Studio到程序调用的项目

前言 最近在使用Qt Design Studio进行开发&#xff0c;但是简中网上要不就是只搜得到Qt Designer(Qt Creator内部库)&#xff0c;要不就只搜得到一点营销号不知道从哪里搬来的账号&#xff0c;鉴于Qt Design Studio是一个这么强大的软件&#xff0c;自然是需要来进行一下小小的…

Spring Boot实现License生成和校验

Spring Boot实现License生成和校验 证书准备 # 1. 生成私钥库 # validity&#xff1a;私钥的有效期&#xff08;天&#xff09; # alias&#xff1a;私钥别称 # keystore&#xff1a;私钥库文件名称&#xff08;生成在当前目录&#xff09; # storepass&#xff1a;私钥库密码…

【大模型推理】vLLM 源码学习

强烈推荐 https://zhuanlan.zhihu.com/p/680153425 sequnceGroup 存储了相同的prompt对应的不同的sequence, 所以用字典存储 同一个Sequence可能占据多个逻辑Block&#xff0c; 所以在Sequence 中用列表存储 同一个block 要维护tokens_id 列表, 需要添加操作。 还需要判断blo…

核心速览12

研究背景 研究问题&#xff1a;这篇文章探讨了多模态人工智能&#xff08;Agent AI&#xff09;系统在理解和响应视觉和语言输入方面的潜力&#xff0c;特别是在物理和虚拟环境中的应用。Agent AI旨在通过感知和行动来增强人工智能系统的交互性和适应性。研究难点&#xff1a;…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

若依springboot 删除一直转 问题处理

src\main\resources\static\ruoyi\js\ry-ui.js submit方法1578行添加 $.operate.successCallback(result); 在线体验 admin/admin123陆陆续续收到一些打赏&#xff0c;为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 演示地址&#xff1a;http://ruoyi.vip 文档地址…

面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案

引言&#xff1a; 随着科技的飞速发展&#xff0c;智能视觉IoT已成为科技领域的热门话题&#xff0c;为智能家居、智慧城市等领域带来新机遇。然而&#xff0c;物联网市场的碎片化特性对智能视觉芯片设计构成挑战。同时&#xff0c;汽车行业正经历技术驱动的变革&#xff0c;软…

Multiple instance learning with graph neural networks文献笔记

基本信息 文章链接&#xff1a;[1906.04881] Multiple instance learning with graph neural networks 将每个包视为一个图&#xff0c;利用GNN学习包的嵌入&#xff0c;以探索包中实例之间有用的结构信息。最终的图表示被送入分类器进行标签预测。 具体方法 输入&#xff…

Elasticsearch是如何实现Master选举的?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch是如何实现Master选举的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch是如何实现Master选举的&#xff1f; Elasticsearch 使用 Zen Discovery 插件&#xff08;在较新的版本中是基于 Zen2&…

WEB-通用漏洞SQL注入CTF二次堆叠DNS带外

知识点&#xff1a; 1、数据库堆叠注入 根据数据库类型决定是否支持多条语句执行 数据库支持多条语句执行就是堆叠&#xff0c;如&#xff1a; 2、数据库二次注入 应用功能逻辑涉及上导致的先写入后组合的注入 3、数据库Dnslog注入 解决不回显&#xff08;反向连接&#…

上生产时连接mysql数据库总是被拒绝

背景&#xff1a; 本地项目连接数据正常 测试环境也正常 到生产上就一直报错 且生产上使用mysql连接工具可以正常连接 报错信息&#xff1a;Connections refused: connect 调查&#xff1a; 数据库版本&#xff1a; 本地 mysql5.7.24 测试 8.3 生产5.7.36 连接驱动&#xf…