Я использую graphql-java, и он выполняет разные вложенные преобразователи в отдельных потоках.
У меня есть собственный фильтр безопасности Spring, который анализирует токен Bearer из заголовка авторизации и добавляет его к текущемувесенний контекст безопасности.
Мне удалось временно решить проблему, прослушав ContextRefreshedEvent и применив стратегию Global, как вы можете видеть здесь:
@EventListener
fun setupSecurityContext(event: ContextRefreshedEvent) {
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_GLOBAL)
}
Я не доволенэто решение, потому что мне нужно получить доступ к токенам в резольверах с помощью глобального статического вызова, когда я хочу получить его, передаваемый в качестве параметра в резольвере.
SecurityContextHolder.getContext().authentication.principal
Я считаю, что это не очень хорошая практика.Я предполагаю, что данные из одного запроса могут быть предоставлены другому пользователю другим потоком.