Сценарий : приложение находится за NGINX, которое завершает соединение TLS и выполняет взаимную аутентификацию с клиентом. Затем NGINX пересылает сертификат клиента в заголовке X-SSL-CERT
приложению на основе Spring. В приложении я хочу получить доступ к информации, содержащейся в сертификате, а также на основе этого создать Authentication
.
Текущий подход : Чтобы запустить его, я реализовал собственный Filter
, который извлекает заголовок, анализирует строку в сертификат X509, извлекает необходимую информацию в настраиваемый Authentication
, а затем использует SecurityContextHolder
для добавления Authentication
в SecurityContext
. Это работает, и я могу получить доступ к Authentication
внутри моих методов контроллера с помощью аннотации @AuthenticationPrinciple
.
Однако, читая документацию, я почувствовал, что этот подход может быть небезопасным, а также не таким, как он предназначен для весны поскольку уже существует X509AuthenticationFilter
для использования в сценарии предварительной аутентификации ios.
Затем мне пришла в голову идея просто поместить проанализированный X509Certificate
внутри атрибута ServletRequest
и использовать предоставленный X509AuthenticationFilter
. Я быстро столкнулся с проблемами, так как я не предоставляю UserDetailsService
.
Вопросы :
- Первый подход, который я описал, считается допустимым / secure?
- Как я могу использовать
X509AuthenticationFilter
для случаев использования предварительной аутентификации - и без указания
UserDetailsService
, поскольку мне ничего не требуется для получения этой информации
- Безопасно ли напрямую использовать
SecurityContextHolder
для добавления моего пользовательского Authentication
изнутри фильтра