Функция приостановки Kotlin теряет ReactiveSecurityContext при вызове java

Когда я вхожу в функцию приостановки, контекст присутствует. Эта функция вызывается из функции контроллера, которая также приостановлена.

suspend fun search(searchRequest: String): String? {
    val context = ReactiveSecurityContextHolder.getContext().map {
      it
    }.awaitFirstOrNull()
    log.info("The context here at the search is $context") 
    return someJava.something();
}

Как только я вхожу в Java-код, контекст в java исчезает. Если я перезвоню в kotlin, контекст безопасности все равно исчезнет.

public String something() {
  return someKotlin.something();
}

fun something(): String {
   val context = ReactiveSecurityContextHolder.getContext().map {
                    it
                 }.awaitFirstOrNull()
   log.info("The context here is always null. Why? $context") 
} 

Есть идеи, как решить эту проблему?

2 ответа

Эта проблема возникла из-за того, что на стороне Java был код блокировки. Как только вы блокируете, цепочка издателей прерывается, и вы теряете контекст подписчика. На заднем сайте это очевидно. Чтобы решить свою проблему, я передал контекст безопасности java-методу и просто сохранил в объекте threadlocal, чтобы к нему можно было получить доступ позже в java-коде и при необходимости передать обратно в kotlin. Это несколько уродливо, но если вы не можете изменить методы java для возврата издателя, этот маршрут - ваш единственный вариант

ReactiveSecurityContextHolder.getContext() не предполагается использовать как глобальную переменную / хранилище.

Предполагается, что вы получите его один раз и выполните все свои действия над результатом.

Связанный ответ здесь /questions/23849550/reactivesecuritycontextholdergetcontext-pust-no-authenticationprincipal-rabotaet/23849560#23849560

Другие вопросы по тегам