Intereting Posts
Замок Kotlin подстановочного знака в параметре обратного вызова списка Котлин создает внутренний класс для лямбда Просмотр не обновляется после первого запуска LiveData при использовании фоновой работы в Android Как добавить библиотеку исходного кода в IntelliJ (например, из Github)? Обработчик ссылки Clickable в TextView Есть ли у Котлина «характер»? Как назначить значение параметру KMutableProperty? Не удалось получить CoordinatorLayout LayoutParams в RecyclerView Как вводить примитивные переменные в Котлин? Класс Котлина не найден при построении с дженкинсами Комната с кинжалом в Котлине: Дао имеет значение null, при введении в класс Как создать построитель для класса данных Kotlin со многими неизменяемыми свойствами Переменная Kotlin String в параметре функции auto cast to java.lang.String, почему? Лучший способ внедрения шаблона посетителя в Котлин Как перевести java-интерфейс в 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. Убедитесь, что ваш собственный поставщик аутентификации обрабатывает все необходимые действия аутентификации.