Intereting Posts
Как преобразовать Char в Int? MyBatis с неизменяемыми классами данных в Котлине Android Studio 3.0 + Kotlin Two Gradle Daemon Android studio конвертирует в Kotlin: используйте @JvmStatic в некоторых случаях Нулевые проверки не вставляются для типа reified, если параметр не является нулевым Представления не отображаются в ViewPager Kotlin: Как получить доступ к методам get и setValue для делегата? Почему мои добавленные NewIssues не передаются на сонар? (Пользовательский плагин Sonar) Как передать параметр типа в ссылку на общий конструктор класса? Вызов действия по ссылке в Котлине Скрытие стандартных конструкторов по умолчанию Как исправить эту ошибку в демо-версии Kotlin Web? Как расширить класс класса Kotlin или использовать общие для создания простого свойства getter, который будет работать во всех подклассах Number? Не учитывать компонент Triple в сравнении Как определить значения, измененные в классе данных Kotlin?

Spring Security несколько успешных поставщиков аутентификации

Я хочу, чтобы пользователи моего веб-приложения были аутентифицированы с помощью LDAP и дополнительной пользовательской аутентификации. Это приложение Spring Boot, написанное в Котлине. Я настроил AuthenticationManagerBuilder следующим образом

@Autowired lateinit var authenticationProvider: CustomAuthenticationProvider override fun configure(auth: AuthenticationManagerBuilder) { auth .authenticationProvider(authenticationProvider) auth .ldapAuthentication() .userDnPatterns("uid={0},ou=people") .groupSearchBase("ou=groups") .contextSource() .url("ldap://localhost:8389/dc=example,dc=com") .and() .passwordCompare() .passwordEncoder(PlaintextPasswordEncoder()) .passwordAttribute("userPassword") } 

Я хочу связать аутентификацию, чтобы, если CustomAuthenticationProvider успешно аутентифицируется (аутентификация функции не выполняется), аутентификация продолжается с использованием LDAP-аутентификатора.

Как написано, если CustomAuthenticationProvider успешно аутентифицируется, аутентификация LDAP (и любой последующий поставщик проверки подлинности) не оценивается. Только при выдаче запроса CustomAuthenticationProvider выполняется аутентификация LDAP.

Я прочитал ряд статей (например, несколько поставщиков аутентификации в Spring Security ), в которых подробно описывается наличие нескольких поставщиков проверки подлинности, но с поведением OR, а не с поведением AND. Какие-либо предложения?

    Может быть, у меня есть. Но давайте проанализируем, что происходит под капотом раньше.

    Реализация диспетчера аутентификации по умолчанию в Spring Security ( ProviderManager ) поддерживает список поставщиков проверки подлинности, а первая, которая выполняет успешную аутентификацию, останавливает цепочку – остальные не вызываются. Я уверен, что вы не можете это изменить. Когда вы используете AuthenticationManagerBuilder вы добавляете поставщиков удостоверений в ProviderManager .

    На картинке ниже показан общий обзор происходящего на высоком уровне:

    Архитектура безопасности

    В исходном коде это выглядит так (подробности пропущены для краткости):

     public Authentication authenticate(Authentication authentication) throws AuthenticationException { Class<? extends Authentication> toTest = authentication.getClass(); ... for (AuthenticationProvider provider : getProviders()) { if (!provider.supports(toTest)) { continue; } try { result = provider.authenticate(authentication); if (result != null) { ... break; } } ... catch (AuthenticationException e) { lastException = e; } } if (result != null) { ... return result; } } 

    Так что ты мог сделать … хм. Сначала вопросы @dur верны 🙂 Во-вторых – очевидно, что вы не можете делать то, что хотите со стандартным менеджером проверки подлинности, что имеет смысл для меня.

    Я думаю, что вы можете попробовать две вещи, если вы все еще хотите пойти так:

    1. Предоставьте свою собственную реализацию менеджера аутентификации в цепочке фильтров. Мне это кажется немного сложным.
    2. Убедитесь, что ваш собственный поставщик аутентификации обрабатывает все необходимые действия аутентификации.