依赖配置(Maven)

xml

复制

下载

运行

<!-- Spring Security Core -->
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-core</artifactId><version>6.2.5</version> <!-- 使用最新版本 -->
</dependency><!-- 如果使用Web安全 -->
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>6.2.5</version>
</dependency><!-- 如果使用配置 -->
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>6.2.5</version>
</dependency>

要正确实现 getCurrentUserId() 方法,需要导入以下 Spring Security 相关的包:

java

复制

下载

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

完整代码示例

java

复制

下载

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;public class SecurityUtils {/*** 获取当前用户ID(需要根据实际认证系统实现)* * 此方法从Spring Security的SecurityContextHolder中获取当前认证信息,* 并返回用户名作为用户ID。如果用户未认证,返回"ANONYMOUS"。* * @return 当前用户ID或"ANONYMOUS"*/public static String getCurrentUserId() {// 从SecurityContextHolder获取认证信息Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if (authentication != null && authentication.isAuthenticated()) {// 返回用户名(可根据需要调整为其他用户标识)return authentication.getName();}return "ANONYMOUS";}
}

关键类说明

  1. SecurityContextHolder

    • 位置:org.springframework.security.core.context.SecurityContextHolder

    • 作用:Spring Security 的安全上下文容器,存储当前线程的安全信息

    • 核心方法:getContext() 获取当前安全上下文

  2. Authentication

    • 位置:org.springframework.security.core.Authentication

    • 作用:表示用户认证信息的接口

    • 核心方法:

      • getName():获取用户名(通常是用户ID)

      • isAuthenticated():检查用户是否已认证

      • getPrincipal():获取用户主体(可能是用户名或UserDetails对象)

      • getAuthorities():获取用户权限

实际项目中的增强实现

在真实项目中,您可能需要更完整的实现:

java

复制

下载

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;public class SecurityUtils {/*** 获取当前用户ID*/public static String getCurrentUserId() {Authentication authentication = getAuthentication();if (authentication != null && authentication.isAuthenticated()) {Object principal = authentication.getPrincipal();// 处理不同类型的Principalif (principal instanceof UserDetails) {return ((UserDetails) principal).getUsername();} else if (principal instanceof String) {return (String) principal;} else if (principal instanceof CustomUser) { // 自定义用户对象return ((CustomUser) principal).getUserId();}}return "ANONYMOUS";}/*** 获取当前用户详细信息*/public static UserDetails getCurrentUserDetails() {Authentication authentication = getAuthentication();if (authentication != null && authentication.isAuthenticated() &&authentication.getPrincipal() instanceof UserDetails) {return (UserDetails) authentication.getPrincipal();}return null;}/*** 检查用户是否具有特定角色*/public static boolean hasRole(String role) {Authentication authentication = getAuthentication();return authentication != null && authentication.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ROLE_" + role));}/*** 安全获取Authentication对象*/private static Authentication getAuthentication() {try {return SecurityContextHolder.getContext().getAuthentication();} catch (Exception e) {// 处理非Web环境或安全上下文未初始化的情况return null;}}
}

使用场景示例

java

复制

下载

@RestController
@RequestMapping("/api/user")
public class UserController {@GetMapping("/profile")public ResponseEntity<UserProfile> getUserProfile() {String userId = SecurityUtils.getCurrentUserId();// 防止匿名访问if ("ANONYMOUS".equals(userId)) {return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();}UserProfile profile = userService.getProfile(userId);return ResponseEntity.ok(profile);}@PreAuthorize("hasRole('ADMIN')")@GetMapping("/admin")public ResponseEntity<String> adminOnly() {return ResponseEntity.ok("管理员专属内容");}
}

常见问题解决方案

  1. 返回 null 而不是用户名

    java

    复制

    下载

    // 使用 getPrincipal() 替代 getName()
    Object principal = authentication.getPrincipal();
    if (principal instanceof UserDetails) {return ((UserDetails) principal).getUsername();
    } else if (principal instanceof String) {return (String) principal;
    }
  2. 匿名用户处理

    java

    复制

    下载

    // 检查匿名用户
    if (authentication instanceof AnonymousAuthenticationToken) {return "ANONYMOUS";
    }
  3. 自定义用户ID

    java

    复制

    下载

    // 实现自定义UserDetails
    public class CustomUserDetails implements UserDetails {private String userId; // 使用用户ID代替用户名// 其他实现...@Overridepublic String getUsername() {return userId; // 返回用户ID}
    }
  4. JWT 集成

    java

    复制

    下载

    // 在JWT认证中获取用户ID
    public class JwtAuthenticationFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {String token = getToken(request);if (token != null && jwtUtil.validateToken(token)) {String userId = jwtUtil.getUserIdFromToken(token);// 创建认证信息UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(userId, null, authorities);SecurityContextHolder.getContext().setAuthentication(auth);}chain.doFilter(request, response);}
    }

总结

核心导入包:

java

复制

下载

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

在 Spring Security 环境中,SecurityContextHolder 是获取当前用户信息的标准方式:

  1. 通过 getAuthentication() 获取认证信息

  2. 通过 getName() 或 getPrincipal() 获取用户标识

  3. 检查 isAuthenticated() 确保用户已认证

  4. 处理匿名用户情况

在实际项目中,通常会创建 SecurityUtils 工具类封装这些安全相关操作,提高代码复用性和可维护性。

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

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

相关文章

【赵渝强老师】OceanBase云平台OCP

OCP的全称是OceanBase Cloud Platform&#xff0c;即&#xff1a;OceanBase云平台。OCP面向有OceanBase管理需求的中小型用户&#xff0c;提供了基础的主机管理、OceanBase 集群和租户运维等能力。在OCP中主要包含两个组成部分&#xff0c;它们分别是&#xff1a;MetaDB和OCP S…

快速定位Swagger文档请求地址‘/v2/api-docs‘,发生未知异常.NullPointerException:精准定位+根治方案

问题现场&#xff1a;访问 http://localhost:8080/v2/api-docs 时日志报错&#xff1a; 请求地址/v2/api-docs,发生未知异常. java.lang.NullPointerException: nullat springfox.documentation.swagger2.mappers.RequestParameterMapper.bodyParameter(RequestParameterMappe…

图像处理解决方案

证件照小工具微信小程序系统是基于微擎开源生态开发的多功能图像处理平台&#xff0c;专为用户提供便捷的证件照制作及图片编辑服务。微擎系统作为一款基于 PHP 开发的开源应用生态系统&#xff0c;具备快速搭建多端应用的能力&#xff0c;其模块化架构与跨平台兼容性为证件照工…

Qt联合Halcon开发四:【详细图解】海康相机配置并链接测试

1. 下载与安装海康 MVS SDK 首先&#xff0c;访问海康机器人官网的下载中心&#xff0c;选择 “Machine Vision” 模块下的 MVS 软件包。 1. 打开浏览器&#xff0c;进入&#xff1a;https://www.hikrobotics.com/cn/ 2. 下载最新版的 MVS 安装包&#xff08;通常以 MVS_x.x.…

vue3打包后,图片丢失

前言&#xff1a; 在 webpack 中使用 require() 来引入静态图片&#xff0c;但在 vite 中就不行。 代码实现 <template><div><img :src"empty"></div> </template><script setup> // 引入本地图片(注意改成您的路径) import em…

MongoDB 8.0.10 windows11安装记录

最近在学习node&#xff0c;看的教程用的是MongoDB 5.0的&#xff0c;安装上和新版的有一些区别&#xff0c;都安装完后不能直接在C:\Program Files\MongoDB\Server\8.0\bin 这个目录使用mongo 启动&#xff0c;因为都没那文件。 摸索了下弄好了。 下载社区版最新安装包&#…

信息系统项目管理师023:云计算(2信息技术发展,网络安全面试问题

2.关键技术 云计算的关键技术主要涉及虚拟化技术、云存储技术、多租户和访问控制管理、云安全技术等。 1&#xff09;虚拟化技术 虚拟化是一个广义术语&#xff0c;在计算机领域通常是指计算元件在虚拟的基础上而不是真实的基础上运行。虚拟化技术可以扩大硬件的容量&#x…

django csrf的局限性

Django的CSRF保护机制虽被广泛应用&#xff0c;但在实际场景中存在以下关键局限性&#xff0c;需开发者特别注意&#xff1a; 一、内容类型限制&#xff08;Content-Type约束&#xff09; 仅保护特定响应类型 CSRF中间件默认只对text/html和application/xmlxhtml响应生效&#…

如何将缓存存到客户端浏览器上呢

要将缓存存到客户端浏览器&#xff0c;关键是让 浏览器接收到合适的 HTTP 缓存控制响应头。这通常通过 add_header 添加控制头来实现。 ✅ 一般做法&#xff08;强缓存 协商缓存&#xff09;&#xff1a; &#x1f539; 1. 强缓存&#xff1a;使用 Cache-Control 和 Expires …

微软ASR与开源模型分析

一、微软ASR核心能力 1. 支持场景 场景功能实时语音转文本低延迟流式识别&#xff08;会议字幕/直播转录&#xff09;音频文件转文本支持多种格式&#xff08;WAV/MP3等&#xff09;&#xff0c;批量处理长音频定制化模型针对特定行业术语&#xff08;医疗/金融&#xff09;训…

2025下半年软考中级科目难度解析与选科指南

2025年下半年软考中级科目共有6科&#xff0c;包括系统集成项目管理工程师、信息系统管理工程师、信息安全工程师、网络工程师、软件设计师以及多媒体应用设计师。面对众多科目&#xff0c;考生应如何做出选择&#xff1f; 一、考试时间安排 在开始备考之前&#xff0c;了解考…

深度剖析:PPP PRIVATE NETWORK UDP/IP AGGLIGATOR

&#x1f680; 深度剖析&#xff1a;PPP PRIVATE NETWORK UDP/IP AGGLIGATOR &#x1f3d7;️ 一、架构概述 这是一个高性能网络聚合系统&#xff0c;核心功能是通过多路TCP连接隧道化UDP流量&#xff0c;提升网络传输的可靠性和性能。系统采用C编写&#xff0c;基于Boost.Asi…

05-StarRocks功能使用FAQ

StarRocks功能使用FAQ 概述 本文档整理了StarRocks功能使用过程中常见的问题和解决方案,涵盖了表管理、分区、索引、物化视图、外部表等核心功能的使用方法和最佳实践。 表管理FAQ Q1: 如何创建和管理表? A: 表管理方法: 1. 创建表 -- 创建基本表 CREATE TABLE table…

ASP.NET Core API文档与测试实战指南

前言 在现代软件开发中&#xff0c;API&#xff08;应用程序编程接口&#xff09;已成为不同服务和应用程序之间通信的桥梁。一个优秀的API不仅需要具备良好的功能性&#xff0c;更需要有完善的文档和全面的测试策略。本文将深入探讨ASP.NET Core环境下的API文档生成与测试实践…

域名 SSL证书和IP SSL证书有什么区别?

在互联网安全领域&#xff0c;SSL证书扮演着至关重要的角色&#xff0c;它能够有效保障数据传输的安全性&#xff0c;防止数据泄露和被篡改。而域名SSL证书与IP SSL证书作为两种不同类型的SSL证书&#xff0c;各自有着独特的特点和适用场景&#xff0c;本文国科云将对它们进行详…

多个Vue项目共用一个node_modules依赖包,避免占用太大内存,window上创建微链接

最近突然发现电脑内存不够了&#xff0c;没办法项目太多了&#xff0c;新加的项目也安装不了依赖包&#xff0c;内存不够了。 然后我最近发现个新东西&#xff0c;就是多个项目共用一个依赖包。 第一步&#xff1a; 可以创建一个空文件夹专门放依赖包&#xff0c;也可以直接用…

目标检测新升级:用YOLOv8打造密度视频热力图可视化

文章目录 目标检测新升级&#xff1a;用YOLOv8打造密度&视频热力图可视化一、YOLOv8的改进&#xff08;一&#xff09;模型结构优化&#xff08;二&#xff09;注意力机制的引入 二、YOLOv8可视化热力图的原理与方法&#xff08;一&#xff09;热力图的基本概念&#xff08…

QT6 源(126)QModelIndex 模型索引:阅读注释与测试其成员函数,及其源代码。以及 typedef QList<QModelIndex> QModelIndexList;

&#xff08;1&#xff09;模型里条目的索引是支持调试打印的 &#xff1a; &#xff08;2&#xff09;还结合上例的测试结果&#xff0c;给出本模型索引的定义&#xff0c;如下 &#xff1a; &#xff08;3&#xff09;继续本模型索引类的成员函数的测试&#xff0c;还使用上面…

分布式环境下 Spring Boot 项目基于雪花算法的唯一 ID 生成方案

一、分布式系统 分布式系统是指将多个独立的计算节点通过网络连接&#xff0c;协同完成同一目标的系统架构。其核心特征是&#xff1a; 多个独立节点&#xff1a;每个节点都是一个可独立运行的服务实例网络通信&#xff1a;节点间通过网络协议&#xff08;如HTTP、RPC&#x…

如何在 Chrome 浏览器中保存从商店下载的扩展程序到本地

如何在 Chrome 浏览器中保存从商店下载的扩展程序到本地 方法一&#xff1a;通过扩展程序页面直接导出&#xff08;适用于已安装的扩展&#xff09; 打开 Chrome 扩展管理页面 在地址栏输入&#xff1a;chrome://extensions/或通过菜单&#xff1a;⋮ > 更多工具 > 扩展…