Spring:如何在平行焊剂上连接securitycontextholder

ckx4rj1h  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(280)

我使用的代码是:

Map<String, ?> result = Flux.range(1, 2)
    .parallel(2)
    .runOn(Schedulers.parallel())
    .map(this::mapWithSecurityContextHolder)
    .sequential()
    .publishOn(Schedulers.single())
    .collect(Collectors.toMap(Pair::getFirst, Pair::getSecond))
    .block();
``` `mapWithSecurityContextHolder` 代码为:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Claims claims = (Claims) authentication.getDetails();

所以, `authentication` 是 `null` 因为flux线程不是请求线程和 `NullPointerException` 升起。
有什么想法吗?
iyfamqjs

iyfamqjs1#

您可以(至少)通过两种方式来实现这一点,要么使用钩子,要么将其放在reactor上下文中。这基本上是一个选择,或多或少的明确。
(未测试,伪代码,可能要检查auth是否不为null等)

Flux.range...
.deferWithContext(ctx -> ctx.<Claims>get("claims")...)
...
.subscriberContext(Context.of("claims",SecurityContextHolder.getContext().getAuthentication().getDetails())
.block()

对于hooks解决方案,我将向您介绍作者使用hooks设置/使用mdc上下文的这篇博客文章。我自己从来没用过,但也可以用

相关问题