通过事件(kafka)触发的功能,无法获取当前用户的信息

通过事件(kafka)触发的功能,无法获取当前用户的信息。

%E5%9B%BE%E7%89%87

我们现在采用saga的方式实现一致性,这种方式确认无法追踪用户信息,你可以把userdetails放入eventPayload,写个AOP执行之前放入threadLocal,执行完清除掉:

    protected void beforeInvoke(CustomUserDetails customUserDetails) {
        if (customUserDetails == null) {
            customUserDetails = new CustomUserDetails("default", "unknown", Collections.emptyList());
            customUserDetails.setUserId(0L);
            customUserDetails.setOrganizationId(0L);
            customUserDetails.setLanguage("zh_CN");
            customUserDetails.setTimeZone("CCT");
        }
        Authentication user = new UsernamePasswordAuthenticationToken("default", "N/A", Collections.emptyList());
        OAuth2Request request = new OAuth2Request(new HashMap<>(0), "", Collections.emptyList(), true,
                Collections.emptySet(), Collections.emptySet(), null, null, null);
        OAuth2Authentication authentication = new OAuth2Authentication(request, user);
        OAuth2AuthenticationDetails oAuth2AuthenticationDetails = new OAuth2AuthenticationDetails(new MockHttpServletRequest());
        oAuth2AuthenticationDetails.setDecodedDetails(customUserDetails);
        authentication.setDetails(oAuth2AuthenticationDetails);
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }

    protected void afterInvoke() {
        SecurityContextHolder.clearContext();
    }

我们是在A服务发起事件,B服务进行事件监听,通过事件发起操作,操作过程中需要用户信息。threadLocal应该是当前线程内共享,我们的A服务和B服务是相互独立的服务,所以这个方式应该无法解决我们的问题。:scream:

用户信息是指userdetails 中的所有字段?跨服务传递用户信息建议将用户数据作为请求数据中的一部分,进行传递,而不是从上下文中获取。

好的,谢谢