Principal包含用户的基本身份信息抽象类

在Spring Security中,Principal接口的一个常见实现是org.springframework.security.core.userdetails.User,包含用户的详细信息,包括用户名,密码,权限等,具体的应用中,Principal通常被用来获取当前登录用户的信息;

具体用途

  1. 身份验证:
    • 在身份验证过程中,Principal 表示已成功验证的实体。通过认证系统(如 LDAP、OAuth 等)验证实体的身份后,会创建一个 Principal 对象来表示该实体。
  2. 授权:
    • Principal 也用于授权过程,决定已验证的实体是否具有执行特定操作或访问特定资源的权限。例如,基于 Principal 的角色或属性,应用程序可以确定用户是否有权访问某个资源或执行某个操作。
  3. 审计和日志记录:
    • 通过 Principal 对象,可以跟踪和记录实体的活动。这对于审计、合规性和安全性分析非常重要。

举例 :

1.获取当前用户信息

在控制器方法中,通过Principal参数可以获取当前登录用户的基本信息:

@GetMapping("/user")`
public String getUser(Principal principal) {String username = principal.getName();return "Current user: " + username;
}

2.获取更加详细的用户信息:

如果需要获取更多的用户详细信息,可以将Principal转换为Authentication对象,并进一步获取用户详情:

@GetMapping("/userDetails")
public String getUserDetails(Authentication authentication) {UserDetails userDetails = (UserDetails) authentication.getPrincipal();String username = userDetails.getUsername();Collection<? extends GrantedAuthority> authorities = userDetails.getAuthorities();return "User: " + username + ", Authorities: " + authorities;
}

Principal`在安全上下文中的角色

在Spring Security中,PrincipalAuthentication密切相关。Authentication对象不仅包含Principal(代表用户信息),还包含用户的认证状态和权限信息。

以下是一些相关的概念:

  • SecurityContext: Spring Security使用**SecurityContext来保存当前认证用户的详细信息**。SecurityContext通过SecurityContextHolder进行管理。
  • Authentication: Authentication接口扩展了Principal接口,表示用户的认证信息。它包含用户的身份信息、认证状态、权限等。
  • UserDetails: UserDetails是Spring Security中用于封装用户详细信息的接口UserDetailsService接口用于根据用户名加载用户详细信息

示例:

假设有一个控制器方法需要显示当前用户的详细信息

@GetMapping("/currentUser")
public String getCurrentUser(Model model, Authentication authentication) {UserDetails userDetails = (UserDetails) authentication.getPrincipal();model.addAttribute("username", userDetails.getUsername());model.addAttribute("authorities", userDetails.getAuthorities());return "userProfile";
}

在这个例子中,通过将Authentication对象注入到控制器方法中,获取当前认证用户的详细信息,并将其添加到模型中以便在视图中使用。

总结:

Principal是一个通用接口,用于表示经过身份验证的用户。通过在控制器方法中注入PrincipalAuthentication对象,可以方便地获取当前登录用户的信息。在Spring Security中,Principal通常与UserDetailsAuthentication接口一起使用,提供更丰富的用户信息和安全功能。

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

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

相关文章

Linux 获取文件大小fstat、stat使用

使用fstat获取时&#xff1a; int fd open(srcfile,O_RDONLY); struct stat src_st; fstat(frd,&src_st); 使用stat时&#xff1a; FILE *fp fopen(“test”, "r"); struct stat st; if (fstat("test", &st) -1) {} 或者&#xff1a; FIL…

HDFS笔记

第1章 HDFS概述 1.1 HDFS产出背景及定义 1&#xff09;HDFS产生背景 随着数据量越来越大&#xff0c;在一个操作系统存不下所有的数据&#xff0c;那么就分配到更多的操作系统管理的磁盘中&#xff0c;但是不方便管理和维护&#xff0c;迫切需要一种系统来管理多台机器上的文…

6-6 二分搜索(分治法)

6-6 二分搜索&#xff08;分治法&#xff09; 分数 10 全屏浏览 作者 王东 单位 贵州师范学院 二分搜索&#xff08;分治法&#xff09; 函数接口定义&#xff1a; int binsearch(int A[],int key,int low,int high); 裁判测试程序样例&#xff1a; #include <iostr…

typeScript debug 调试

以leetcode 20为例 0.首先编写代码 function isValid(s: string): boolean {let stack: string[] []for (let index 0; index < s.length; index) {let x: string s[index]debuggerswitch (x) {case (:stack.push())breakcase [:stack.push(])breakcase {:stack.push(})…

快速压缩前端项目

背景 作为前端开发工程师难免会遇到需要把项目压缩成压缩文件来传送的情况&#xff0c;这时候需要压缩软件进行压缩文件处理 问题 项目中的依赖包文件非常庞大&#xff0c;严重影响压缩速度&#xff0c;即使想先删除再压缩&#xff0c;删除文件也不会很快完成 解决 首先要安…

Qt底层原理:深入解析QWidget的绘制技术细节(2)

&#xff08;本文续上一篇《Qt底层原理&#xff1a;深入解析QWidget的绘制技术细节(1)》&#xff09; QWidget绘制体系为什么这么设计【重点】 在传统的C图形界面框架中&#xff0c;例如DUILib等&#xff0c;控件的绘制逻辑往往直接在控件的类的内部&#xff0c;例如PushButt…

【Android】怎么使APP进行开机启动

项目需求 在Android系统开启之后&#xff0c;目标app可以在系统开机之后启动。 项目实现 使用广播的方式 首先我们要创建一个广播(这里是启动了一个Service服务) public class BootReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, I…

EXCELITAS电源维修TLX302高压电源维修

埃赛力达电源维修 EXCELITAS电源维修 海曼电源维修 高压电源维修 EXCELITAS高压电源维修故障包括&#xff1a;无输出&#xff0c;高压达不到&#xff0c;电流达不到标准&#xff0c;高压打火,高压线接头处太靠近铁壳部分。无光,风扇不转。保险丝断&#xff0c;可以强制发光,不…

Java——构造器(构造方法)和 this

一、什么是构造器 构造器&#xff08;Constructor&#xff09;是Java类的一种特殊方法&#xff0c;用于初始化对象的状态。构造器在创建对象时被调用&#xff0c;可以对对象的成员变量进行初始化。 我之前的文章《Java——类和对象-CSDN博客》中也提到了构造器。 二、构造器…

文件二维码怎么快速生成?在线文件生码的使用技巧

文件现在经常会做成二维码的方式来展示内容&#xff0c;通过这种方式能够更加简单快捷的将文件分享给其他人查看或者下载&#xff0c;而且文件生成活码可以长期使用&#xff0c;随时替换当前二维码中的内容&#xff0c;那么可以长期使用的文件二维码该如何制作呢&#xff1f; …

Android开发Activity生命周期详解

本文详解Android开发Activity生命周期。 目录 一、Activity 二、Activity生命周期 三、生命周期特性 四、常见情况生命周期的执行顺序 一、Activity Activity是用户交互的第一接口&#xff0c;它提供了一个用户完成指令的窗口。当开发者创建Activity之后&#xff0c;通过…

bms电池管理系统中放电过流1,放电过流2,放电过流3,分别是什么意思

在电池管理系统&#xff08;BMS&#xff09;中&#xff0c;“放电过流1”、“放电过流2”、“放电过流3” 这些术语可能代表了不同级别的放电过电流保护阈值或状态。这些级别通常是基于电池的安全工作范围和性能特性来设定的&#xff0c;用以在不同的电流水平下提供不同程度的保…

Springboot 集成 Shardingsphere-JDBC

Springboot 集成 Shardingsphere-JDBC Shardingsphere系列目录&#xff1a;背景前提新增依赖分表策略简单分库分表策略垂直分库广播表水平分库(单表)水平分库(多表)水平分表 HINT配置逻辑代码 自定义分库分表&#xff08;精准定位范围查询&#xff09;配置代码精准定位数据库精…

什么是本地启动?

今天在进行接口测试的时候&#xff0c;我刚开始傻乎乎的&#xff0c;不会测试嘛&#xff0c;那个 postman 里面叫你填那个URL&#xff0c;我就把设备管理系统的地址填了上去&#xff1a;http://192.168.0.237.27000/。 睿哥看了之后&#xff0c;跟我说&#xff1a;“你填这个地…

Linux DNS配置文档

一、问题描述 1. 无法在浏览器通过域名访问百度&#xff1b; 2. 无法在终端 ping 通百度&#xff0c;例如&#xff1a;ping www.baidu.com 3. 可以 ping 通公网地址&#xff0c;例如&#xff1a;ping 114.114.114.114 或 ping 8.8.8.8 二、问题原因 域名解析 DNS 配置错误&am…

数据结构历年考研真题对应知识点(单链表、双链表、循环链表)

目录 2.3线性表的链式表示 2.3.1单链表的定义 【单链表的应用(2009、2012、2013、2015、2016、2019)】 2.3.2单链表上基本操作的实现 【单链表插入操作后地址或指针的变化(2016)】 2.3.3双链表 【双链表中插入操作的实现(2023)】 【循环双链表中删除操作的实现(2016)】 …

如何抓取 GitHub:实用教程 2024

GitHub 是互联网上最重要的技术知识来源之一&#xff0c;对于构建复杂应用程序的开发人员来说尤其如此。跟随本指南学习如何提取这些宝贵的数据&#xff0c;毫不费力地紧跟最新技术趋势。 了解 GitHub 数据 开源项目文化为开发人员提供了许多分享、贡献和合作的机会&#xff…

多个类下所有方法AOP

微服务下有两个类&#xff0c;需要做异常捕获再抛出&#xff0c;笔者立马想到了AOP 非微服务&#xff0c;只能使用代理 Slf4j Aspect Component public class SdkAspect {Pointcut("execution(* com.aspire.service.impl.XxxEncryption.*(..))")public void enPointc…

android的surface

相信很多Android开发者都知道Canvas类是UI的画布&#xff08;虽然这种说法并不严谨&#xff09;&#xff0c;因为我们在Canvas上完成各种图形的绘制&#xff0c;那么我们Activity上的各种交互控件又是如何展示并渲染到屏幕上的呢&#xff0c;所以在另一个层面上也有一个“画布”…

安卓开发拉起其他应用的常用方式

在安卓开发中&#xff0c;拉起其他应用&#xff08;即启动其他应用&#xff09;有几种常见的方式&#xff1a; 通过显式 Intent&#xff1a; 这种方式需要知道目标应用的包名和具体的 Activity 名称。 Intent intent new Intent(); intent.setComponent(new ComponentName(…