关于SpringSecurity Context 中获取和更改当前用户信息的问题

 更新时间:2024年09月11日 16:12:48   作者:零offer在手  
SpringSecurityContext在异步线程中无法获取用户信息,因其与请求线程绑定;此外,用户信息更新后跳转页面时,身份会被降级为匿名,导致信息无法及时同步,本文给大家介绍SpringSecurity Context 中获取和更改当前用户信息的问题,感兴趣的朋友一起看看吧

SpringSecurity Context 获取和更改用户信息的问题

SecurityContext 异步线程中获取用户信息

今天在做项目时遇到了一个问题,我需要获取当前用户的 ID。之前,前端并没有存储用户信息,我一直是在后端的 service 中通过 SecurityContext 来获取用户信息,这个方法之前一直有效。然而,今天在另一个 service 中调用时却无法获取到用户信息。

经过详细排查,发现 SecurityContext 的内容是与请求线程(如 HTTP 请求)绑定的。但我当前的 service 是用于处理 MQTT 消息,这属于异步线程。因此,在异步线程中无法从 SecurityContext 获取用户信息,只能另寻解决方案。

 /**
     * 处理接收到的设备数据,根据数据类型进行不同的处理。energy数据存储到数据库,其他数据通过WebSocket发送到前端展示。
     * @param data 数据内容
     */
    private void handleIncomingData(String data) {
        	......
            /*
                * 通过设备ID找到用户ID, 不能通过securityContext获取当前用户ID,因为这里是异步处理消息,不在请求线程中。
                * 通过securityContext获取当前用户ID的方法只能在请求线程中使用,通常是与HTTP请求相关的操作才能获取到。
                * 这里是MQTT消息处理,不在请求线程中,所以要通过其他方式获取当前用户ID。
                * 还因为这里是存入数据库,因为也不能依赖物理设备的用户ID,设备不一定是存用户ID, 降低耦合性。
               TODO: 这里是否可以改进?
             */
            long userId = deviceMapper.findDeviceById(deviceId).getUserId();
            if (userId<=0) {//如果userId<=0,说明没有找到对应的设备
                logger.error("Failed to get user id by device id: {}", deviceId);
                throw new RuntimeException("Failed to get user id by device id: " + deviceId);
            }
            Energy energy = new Energy();
            energy.setDeviceId(deviceId);
            energy.setEnergy(totalEnergy);
            energy.setRecordDate(recordDate);
            energy.setUserId(userId);
			......
    }

SecurityContext 线程降级问题

在项目中遇到 SecurityContext 线程降级的问题,具体场景是用户修改个人资料(如邮箱)后,我希望 SecurityContext 中的用户信息能及时更新。然而,在修改邮箱后,用户需要跳转到邮箱验证码验证页面,该页面通过 security 配置中的 permitAll() 允许匿名访问。

这个配置导致一个问题:虽然用户已经登录认证,但在访问 /verify-code 页面时,SecurityContext 中的身份会被降级为匿名用户,进而导致更新后的信息没有在 SecurityContext 中及时反映。

我了解到可以通过 setAuthentication() 手动更新 SecurityContext,但尝试后依然无法解决问题,更新后的用户信息仍旧无法及时同步到 SecurityContext 中~

   @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf(AbstractHttpConfigurer::disable) // disable csrf
                .authorizeHttpRequests(authorize -> authorize
                        .requestMatchers("/login","/register","/verify-code","/forgot-password","/change-password").permitAll()// permit request without authentication
                        .requestMatchers("/ws/**").permitAll()// permit websocket request without authentication
                        .anyRequest().authenticated()
                )
                .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
                .logout(AbstractHttpConfigurer::disable);// disable logout otherwise it will conflict with our custom logout
        return http.build();
    }

到此这篇关于SpringSecurity Context 中 获取 和 更改 当前用户信息的问题的文章就介绍到这了,更多相关SpringSecurity Context 获取当前用户信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java四大常用JSON解析工具性能对比(Hutool、Fastjson2、Gson与Jackson)

    Java四大常用JSON解析工具性能对比(Hutool、Fastjson2、Gson与Jackson)

    JSON 是现代软件开发中常用的数据交换格式,尤其在微服务和前后端分离的架构中更是必不可少,本文将对 Java 中四大主流 JSON 解析库进行性能测试和对比分析,希望对大家有所帮助
    2025-05-05
  • SpringBoot3.x嵌入MongoDB进行测试的步骤详解

    SpringBoot3.x嵌入MongoDB进行测试的步骤详解

    本文介绍了在 Spring Boot 应用中使用Flapdoodle Embed Mongo进行 MongoDB 测试的方法,包括Embed Mongo 的概念,添加依赖、配置、运行测试的步骤,还列举了其优势如快速启动关闭、环境一致、无需外部依赖等,以及注意事项和结论,需要的朋友可以参考下
    2024-12-12
  • 利用SpringBoot解决多个定时任务阻塞的问题

    利用SpringBoot解决多个定时任务阻塞的问题

    当我们在Spring Boot应用中使用多个定时任务时,任务之间的阻塞可能是一个常见的问题,这可能会因任务之间的依赖、执行时间过长或资源争用等原因而发生,本文让我们深入探讨如何利用Spring Boot来解决多个定时任务阻塞的问题,感兴趣的小伙伴跟着小编一起来看看吧
    2024-01-01
  • EasyExcel实现读写Excel文件的示例代码

    EasyExcel实现读写Excel文件的示例代码

    EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。它可以在尽可能节约内存的情况下支持读写百M的Excel,所以本文就将利用它实现读写Excel文件,感兴趣的可以了解一下
    2022-08-08
  • java 转发和重定向区别及实例代码

    java 转发和重定向区别及实例代码

    这篇文章主要介绍了java 转发和重定向区别及实例代码的相关资料,需要的朋友可以参考下
    2016-11-11
  • IDEA中springboot提示java:找不到符号符号:变量log问题

    IDEA中springboot提示java:找不到符号符号:变量log问题

    这篇文章主要介绍了IDEA中springboot提示java:找不到符号符号:变量log问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java SpringBoot容器注入对象详解

    Java SpringBoot容器注入对象详解

    本文通过实例代码给大家详解了springboot获取ioc容器中注入的bean问题,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-09-09
  • Javaweb实现上传下载文件的多种方法

    Javaweb实现上传下载文件的多种方法

    本篇文章主要介绍了Javaweb实现上传下载文件,有多种实现方式,需要的朋友可以参考下。
    2016-10-10
  • Java集合遍历全指南(迭代器&增强for及列表迭代器)

    Java集合遍历全指南(迭代器&增强for及列表迭代器)

    本文详尽介绍了Java集合遍历的5种方式:迭代器、增强for、列表迭代器、普通for及Lambda表达式,通过代码示例和原理解析,帮助读者彻底掌握集合遍历的核心知识,避免常见错误如并发修改异常和指针复位问题,适合Java初学者及面试复习,需要的朋友可以参考下
    2026-02-02
  • 使用springBoot中的info等级通过druid打印sql

    使用springBoot中的info等级通过druid打印sql

    这篇文章主要介绍了使用springBoot中的info等级通过druid打印sql,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论