Я сам искал эту проблему.Мне еще предстоит найти стек аутентификации, который делает X509-> разрешение учетной записи "правильным".Я зациклился на том факте, что интерфейс UserDetailsService Spring Security настаивает на использовании строкового идентификатора для поиска, но во многих случаях невозможно получить такой UID из информации, содержащейся в теме сертификата X509 (например, существует много cn = John Smith).в мире, или даже в пределах одной организации, и электронная почта не требуется в сертификате DN).Уникальность сертификата заключается в комбинации «эмитент + серийный номер», а не в субъекте.
После просмотра API есть несколько способов сделать это.В любом случае, вероятно, не требуется использование пространства имен и настройка цепочки фильтров и бинов самостоятельно:
1) Реализуйте свой собственный AuthenticationUserDetailsService и привяжите его к PreAuthenticatedAuthenticationProvider.Я полагаю, что по умолчанию пространство имен устанавливает UserDetailsByNameServiceWrapper с использованием переданного user-service-ref.Пройдя по этому маршруту, вы должны сделать все, чтобы настроить UserDetails, включая разрешение уполномоченных лиц.Конечно, вы можете делегировать все это, но это больше работы.
2) Если ваше хранилище LDAP основано на некотором UID, и это тот путь, к которому я склоняюсь, реализуйте свой собственный X509PrincipalExtractor и привяжите его кX509AuthenticationFilter и возвращает строку uid, на которую настроен ваш LDAPUserDetailsService.В экстракторе реализуйте логику для поиска сохраненного сертификата в вашем хранилище LDAP.Я не знаю каких-либо стратегий, которые будут работать на серверах LDAP, самый простой способ будет, если ваш LDAP поддерживает RFC4523 certificateMatch или certificateExactMatch, и вы можете настроить поисковый фильтр, который вернет вам уникальную учетную запись, из которой вы затем сможете вернуть атрибут, который вынужно (например, sAMAccountName).Если нет, если ваши сертификаты содержат значение, которое вы можете фильтровать (например, сертификат cn = LDAP cn), которое вы можете использовать для получения набора кандидатов результатов LDAP, извлеките их сертификаты в X509Certificate и выполните .equals () для переданногов сертификате, чтобы найти учетную запись, которая соответствует и вернуть его UID.