Spring Security 中的主体(Principal)

在 Spring Security 中,Principal 表示用户的标识,可以是用户名、用户对象或其他任何形式的用户识别信息。它是进行授权决策和根据已认证用户的信息定制用户交互的关键引用。

Principal 概述

Principal 在 Spring Security 中表示当前登录用户的标识,通常是一个实现了 AuthenticatedPrincipal 接口的对象。该接口包含一个 getName() 方法,用于返回已认证用户的名称。

当用户通过身份验证后,应用程序会将一个 Principal 对象与该用户关联,并将其保存以记住用户的身份。因此,用户在后续请求中无需再次登录。

Principal 的关键点

  • 表示Principal 代表已认证用户的身份,便于访问特定于用户的数据。
  • 安全上下文:Spring Security 将 Principal 存储在 SecurityContextHolder 中,使其在应用的不同层中均可访问。

使用 Principal 的实用示例

示例 1:在控制器中访问 Principal

一个常见的用例是在控制器中检索用户详情,以个性化用户体验或执行安全检查。

@RestController
public class UserController {@GetMapping("/user/profile")public ResponseEntity<String> userProfile(Principal principal) {return ResponseEntity.ok("Accessed by: " + principal.getName());}
}

在这个示例中,Principal 直接注入控制器方法,方便地获取已认证用户的用户名。

示例 2:使用 Principal 定制方法安全

Spring Security 的方法安全注解可以利用 Principal 实现细粒度的访问控制。

@PreAuthorize("#username == principal.username")
public void updateUser(String username, UserUpdateDto updateDto) {// 更新用户逻辑
}

这里,@PreAuthorize 使用 SpEL 确保已认证用户只能更新自己的信息,展示了基于 Principal 的动态授权。

示例 3:在服务层访问 Principal

您可能还需要在服务层访问已认证用户的详情,例如进行审计或应用业务逻辑。

@Service
public class TaskService {public void assignTaskToCurrentUser(String taskId) {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();String currentUsername = authentication.getName();// 根据 currentUsername 分配任务给用户}
}

此示例从 SecurityContextHolder 获取 Authentication 对象,以访问当前用户的用户名,说明 Principal 可以在控制器方法之外的场景中使用。

结论

Spring Security 中的 Principal 是一个强大的概念,在保护应用方面发挥着关键作用。

通过上述示例可以看出,Spring Security 提供了灵活且简单的方法来跨不同应用层访问和利用 Principal

这不仅增强了应用的安全性,还提供了个性化的用户体验。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32的智能垃圾分类投递系统设计

目录 引言系统需求与设计目标硬件设计 3.1 核心控制模块 3.2 传感器模块 3.3 驱动模块 3.4 显示模块 3.5 通信模块软件设计 4.1 数据采集与处理 4.2 垃圾分类逻辑实现 4.3 状态显示与远程监控代码实现 5.1 数据采集与处理 5.2 分类逻辑与控制 5.3 状态显示与通信 5.4 主程序实…

手摸手6-创建前端应用

目录 手摸手6-创建前端应用简介命令 npm create vue 和 npm init vue3的区别 使用 Create-Vue 创建应用1、输入命令 npm create vue 创建应用2、输入命令 npm install 安装相关依赖3、输入命令 npm run dev 运行项目 项目结构 手摸手6-创建前端应用 简介 create-vue 是 vue 应…

第T8周:Tensorflow实现猫狗识别(1)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: &#xff08;二&#xff09;具体步骤 from absl.l…

【MySQL】数据库基础

1.数据库基本认识 广义上来说数据库是长期存储在磁盘上的数据文件的集合&#xff0c;而MySQL是采用了C/S模式实现的一个网络服务&#xff0c;它由MySQL&#xff08;数据库客户端&#xff09; 、MySQLD &#xff08;数据库服务&#xff09;、磁盘上的数据库文件组成。MySQL服务是…

AWS IAM

一、介绍 1、简介 AWS Identity and Access Management (IAM) 是 Amazon Web Services 提供的一项服务&#xff0c;用于管理 AWS 资源的访问权限。通过 IAM&#xff0c;可以安全地控制用户、组和角色对 AWS 服务和资源的访问权限。IAM 是 AWS 安全模型的核心组成部分&#xf…

windows C#-异步编程场景(二)

等待多个任务完成 你可能发现自己处于需要并行检索多个数据部分的情况。 Task API 包含两种方法(即 Task.WhenAll 和 Task.WhenAny)&#xff0c;这些方法允许你编写在多个后台作业中执行非阻止等待的异步代码。 此示例演示如何为一组 User 捕捉 userId 数据。 private stati…

web——sqliabs靶场——第九关——时间盲注

什么是时间盲注 时间盲注是指基于时间的盲注&#xff0c;也叫延时注入&#xff0c;根据页面的响应时间来判断是否存在注入。 使用sqlmap不同的技术 sqlmap --technique 参数用来设置具体SQL注入技术 B: Boolean-based blind 基于布尔的忙逐步 E:Error-based 报错注入 U&am…

Vue所有图片预加载加上Token请求头信息、图片请求加载鉴权

环境 Vue2、“axios”: “0.18.1”、webpack&#xff1a;“4.46.0”、ant-design-vue: “1.7.8” 描述 项目对安全要求比较高&#xff0c;所有后台返回的图片加载时都要加上token。比如资源图片&#xff0c;拍照打卡的图片&#xff0c;都需要鉴权。如果不带上token参数&…

此电脑中的百度网盘图标无法删除解决方法2024/11/18

教程很详细&#xff0c;直接上步骤 对于这种情况&#xff0c;修改注册表是很麻烦的&#xff0c;眨眼睛在这里推荐这位大佬的开源软件MyComputerManager 点击跳转MyComputerManager下载链接

【模型级联】YOLO-World与SAM2通过文本实现指定目标的零样本分割

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Postman之变量操作

系列文章目录 Postman之变量操作 1.pm.globals全局变量2.pm.environment环境变量3.pm.collectionVariables集合变量4.pm.variables5.提取数据-设置变量-进行参数化串联使用 postman中分为全局变量、环境变量、集合变量、和普通变量 分别使用pm.globals、pm.environment、pm.co…

linux 常用命令指南(存储分区、存储挂载、docker迁移)

前言&#xff1a;由于目前机器存储空间不够&#xff0c;所以‘斥巨资’加了一块2T的机械硬盘&#xff0c;下面是对linux扩容的一系列操作&#xff0c;包含了磁盘空间的创建、删除&#xff1b;存储挂载&#xff1b;docker迁移&#xff1b;anaconda3迁移等。 一、存储分区 1.1 …

python读取Oracle库并生成API返回Json格式

一、安装必要的库 首先&#xff0c;确保已经安装了以下库&#xff1a; 有网模式 pip install flask pip install gevent pi install cx_Oracle离线模式&#xff1a; 下载地址&#xff1a;https://pypi.org/simple/flask/ # a. Flask Werkzeug-1.0.1-py2.py3-none-any.whl J…

Nature子刊 | 单细胞测序打开发育系统溯源新视角

神经系统是人体最为复杂且最为重要的器官之一。深入理解神经发育对于神经科学研究和再生医学具有举足轻重的作用。但神经元多样性的起源仍是一个亟待解决的难题。日益发展的单细胞测序技术让研究人员们有机会从细胞的异质性入手&#xff0c;对不同细胞类型之间的关联和分化路径…

5G CPE与4G CPE的主要区别有哪些

什么是CPE&#xff1f; CPE是Customer Premise Equipment&#xff08;客户前置设备&#xff09;的缩写&#xff0c;也可称为Customer-side Equipment、End-user Equipment或On-premises Equipment。CPE通常指的是位于用户或客户处的网络设备或终端设备&#xff0c;用于连接用户…

新增道路查询最短路径

一、问题描述 给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市&#xff0c;编号从 0 到 n - 1。初始时&#xff0c;每个城市 i 都有一条单向道路通往城市 i 1&#xff08; 0 < i < n - 1&#xff09;。 queries[i] [ui, vi] 表示新建一条从城市 ui 到城市…

【数据结构】链表解析与实战运用(1.8w字超详细解析)

目录 引言 链表概念及结构 链表的优缺点 链表的分类 1.单向或者双向 2.带头或者不带头 3.带循环或者非循环 单链表接口函数的实现 接口函数一览 创建空节点&打印链表 尾部插入 头部插入 尾部删除 头部删除 查找 在pos位置之后插入节点 在pos位置之前插入节…

Python练习31

Python日常练习 题目&#xff1a; 分别输入两个整数以及一个加减乘除中的算术运算符&#xff0c;输出运算结果&#xff0c; 若输入其它运算符&#xff0c;则退出程序; 例如&#xff1a; 输出格式如下 【输入一个整数&#xff1a;】1 【输入另一个整数&#xff1a;】2 …

uniapp 自定义加载组件,全屏加载,局部加载 (微信小程序)

效果图 全屏加载 页面加载使用 局部加载 列表加载里面使用 使用gif html <template><view><view class"" v-if"typeFullScreen"><view class"loading" v-if"show"><view class""><i…

Mac 修改默认jdk版本

当前会话生效 这里演示将 Java 17 版本降低到 Java 8 查看已安装的 Java 版本&#xff1a; 在终端&#xff08;Terminal&#xff09;中运行以下命令&#xff0c;查看已安装的 Java 版本列表 /usr/libexec/java_home -V设置默认 Java 版本&#xff1a; 找到 Java 8 的安装路…