如何使用来自 ReactiveSecurityContextHolder.getContext() 的参数调用 void 方法

Posted

技术标签:

【中文标题】如何使用来自 ReactiveSecurityContextHolder.getContext() 的参数调用 void 方法【英文标题】:How can I call a void method with a parameter coming from ReactiveSecurityContextHolder.getContext() 【发布时间】:2020-08-27 05:54:40 【问题描述】:

我对 reactor 还很陌生,我已经被以下代码卡住了太多时间,这些代码对我不起作用,我不知道下一步该做什么。

我已将我的代码简化如下:

@RestController
public class HelloController 

   @Autowired
   @Qualifier("currentUserService")
   private CurrentUserContextService userContextService;



   @GetMapping("/v1/hello2")
   public Mono<PulseUser> getHello2() 
       final Mono<PulseUser> currentUser2 = Mono
            .just(new PulseUser("login", "pasdsword", Collections.emptyList(), 65));

       currentUser2.subscribe(user -> 
          System.out.println("+++++++++" + user);
       );

       userContextService.getCurrentUser().subscribe(user -> 
           System.out.println("*************" + user);
       );

       return userContextService.getCurrentUser();
   

像这样使用 userContextService:

@Service("currentUserService")
public class CurrentUserContextServiceImpl implements CurrentUserContextService 

   @Override
   public Mono<PulseUser> getCurrentUser() 
    final Mono<SecurityContext> context = ReactiveSecurityContextHolder.getContext();
    return context.map(security -> 
        final PulseUser details = (PulseUser) security.getAuthentication().getDetails();
        return details;
    );

  

有了这个,代码,我得到了什么:

如果我点击 /v1/hello2,我会收到当前用户的 json 响应:OK 我还获得了第一个 Sysout,带有“+++”分隔符的那个:好的 但我没有得到第二个,带有“****”分隔符的那个:KO

我是这样诊断的:

我收到 json 响应,证明 getCurrentUser() 确实有效。 我得到了第一个 sysout,证明订阅代码确实有效 我没有得到我绝对无法理解的第二个系统输出。

显然,我对第二个 sysout 感兴趣,因为它看起来像是我想要开始工作的代码,即: 调用myMethod(PulseUser myUser),其中myUser 来自userContextService.getCurrentUser()

稍微清楚一点:

public void touch(MyData data) 
   //use the mono value of userContextService.getCurrentUser()
   //and call a method on data using the current PulseUser of the Mono

有人可以帮帮我吗?

【问题讨论】:

【参考方案1】:

终于用ReactiveSecurityContextHolder is empty in Spring WebFlux这个帖子找到了解决办法

我试图访问通量之外的安全上下文,这导致了一个空的 Mono。

【讨论】:

以上是关于如何使用来自 ReactiveSecurityContextHolder.getContext() 的参数调用 void 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用社交框架呈现来自 SKscene 的 UIViewController?

如何知道请求是不是来自缓存或不使用 AFNetworking

如何使用 jQuery 显示来自 JSON 的多个数组?

如何使用来自 API 的 JSON 填充选择列表?

如何使用 RestTemplate 在 Spring MVC 应用程序中访问来自(来自 Spring RESTful 服务)的巨大 JSON

如何使用来自passportjs的会话