如何从ReactiveSecurityContextHolder中存储的Jwt中提取信息,它返回一个Mono,< String>但我需要字符串

i1icjdpr  于 2023-01-13  发布在  Spring
关注(0)|答案(1)|浏览(151)
    • bounty将在3天后过期**。回答此问题可获得+50声望奖励。gstackoverflow希望引起更多人关注此问题。

以下代码从ReactiveSecurityContextHolder返回Mono

@Component
public class SomeClass {
public static Mono<String> issuesID() {
        return ReactiveSecurityContextHolder.getContext().switchIfEmpty(Mono.empty()).flatMap((securityContext) -> {
            Authentication authentication = securityContext.getAuthentication();
            Jwt jwt = (Jwt) authentication.getPrincipal();
            String issuer = (String) jwt.getClaims().get("some_claim");
            log.info("{}",issuer);
            return Mono.justOrEmpty(issuer);
        }).switchIfEmpty(Mono.empty());
    }
}

我需要像String mutatedId = PREXIX+SomeClass.issuesID();这样的东西
如果我做以下事情,

  1. PREXIX+SomeClass.issuesID().block();
  2. PREXIX+SomeClass.issuesID().subscribeOn(Schedulers.elastic()).block();
  3. PREXIX+SomeClass.issuesID().toProcessor().block();
  4. PREXIX+SomeClass.issuesID().toFuture().get();
    它们都给出相同的误差。
block()/blockFirst()/blockLast() are blocking, which is not supported in thread rector-xxx

我也试过推迟单声道,但也无济于事。
我知道reactor是一个非阻塞的框架,阻塞是令人沮丧的,但在我的情况下,我找不到其他方法来解决这个问题。
我需要将mutatedId传递给mongoFactory,这样我就可以根据每个请求的Jwt属性切换数据库。我不想在控制器中注入@AuthenticationPrincipal,并不断将其传递给下层,最终在DOA层做出决策。

@Override
public Mono<MongoDatabase> getMongoDatabase(String dbName) throws DataAccessException {
      String mutatedId = PREXIX+SomeClass.issuesID();
      return super.getMongoDatabase(mutatedId+"@"+dbName);
}

有何建议可达致这个目标,或有何更佳的方法。

ddarikpa

ddarikpa1#

例如,可以使用flatMap

Mono<MongoDatabase> db = issuesID()
   .flatMap(id -> getMongoDatabase(id));

相关问题