Почему SecurityContextHolder.getContext (). Аутентификация становится равной нулю внутри асинхронного метода Kotlin? - PullRequest
0 голосов
/ 22 октября 2019

Я новичок в Kotlin Coroutines и хочу вызвать API для каждого из моих сотрудников в асинхронном режиме. Но я столкнулся с проблемой, связанной с новой сопрограммой, я не могу получить аутентификацию от SecurityContextHolder.getContext.

Кто-нибудь может объяснить, пожалуйста, почему SecurityContextHolder.getContext().authentication становится равным null внутри GlobalScope.async{...} блока в Котлине? У новой сопрограммы есть отдельный контекст безопасности? И как мне решить эту проблему? Есть ли способ избежать передачи аутентификации от вызывающей функции perform() к функции callApi()?

Ниже вы можете найти фрагмент кода:

fun perform() {
    // SecurityContextHolder.getContext().authentication contains some value!!!

    val deferred = employeesRepository.getEmployees().map { callApi(it) }

    runBlocking {
        deferred.forEach { it.await() }
    }

}

fun callApi(employee: EmployeeModel) = GlobalScope.async {
    // SecurityContextHolder.getContext().authentication is null here!!!
}

1 Ответ

0 голосов
/ 22 октября 2019

Если я правильно помню, SecurityContextHolder.getContext() содержит локальную ссылку на объект аутентификации. Используя сопрограммы, вы фактически переключаетесь на другой поток (у которого нет объекта локальной аутентификации потока).

Я думаю, что передача объекта аутентификации могла бы работать, это была моя первая идея, когда я начал читать ваш вопрос. Почему вы хотите избежать этого?

Возможно, вы можете создать контекст сопрограммы с объектом аутентификации (или существует ли для этого существующий?), Но это только предположение от меня, у меня нет реального опытас сопрограммами.

edit: При быстром поиске я нашел это. Вы можете найти интересные идеи в этой теме: https://github.com/Kotlin/kotlinx.coroutines/issues/119

...