通过事件(kafka)触发的功能,无法获取当前用户的信息。
我们现在采用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服务是相互独立的服务,所以这个方式应该无法解决我们的问题。
用户信息是指userdetails 中的所有字段?跨服务传递用户信息建议将用户数据作为请求数据中的一部分,进行传递,而不是从上下文中获取。
好的,谢谢