gpt4 book ai didi

java - 使用 spring security 在服务层中获取登录用户

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:07:57 26 4
gpt4 key购买 nike

我在服务层有一个异步方法,它从队列中读取消息。我需要将收到的消息发送给当前登录用户的订阅者。

在我的 Controller 中,我将用户获取为

(CustomUserDetail)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

工作正常但服务层中的相同代码抛出空指针异常。可能是由于 SecurityContextHolder 没有在同一请求响应流中被调用,而是异步调用,但同时我认为 Spring Security 将所有用户安全数据保存在 session 中。所以它应该可以正常工作。

任何人都可以提出解决方法。如何在服务层获取登录用户?

我认为一种可能的方法是在 Controller 方法将消息推送到队列时将 Activity 用户添加到 session 中,然后在服务层从 session 中检索用户。

最佳答案

Spring SecurityContextHolder 默认模式是 MODE_THREADLOCAL 这意味着 SecurityContextHolder 仅在同一执行线程中可用。

将其更改为 MODE_INHERITABLETHREADLOCAL,您应该可以在所有生成的线程中访问 SecurityContextHolder

SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)

应该可以解决您的问题。

关于java - 使用 spring security 在服务层中获取登录用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com