Подтвердить что ты не робот

В памяти и пользовательских провайдерах все вместе

Я настраиваю мое веб-приложение Spring Security (v4.0.1). Я хочу иметь двух поставщиков проверки подлинности, "в памяти", чтобы управлять учетной записью администратора и пользовательской, которая ссылается на мою собственную реализацию. Система должна попытаться выполнить аутентификацию против провайдера "внутри памяти" в первую очередь и против пользовательского на втором месте. Мой код выглядит следующим образом:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth, 
    AuthenticationProvider provider) throws Exception {
    auth.inMemoryAuthentication()
            .withUser("admin")
            .password("s3cr3t")
            .authorities("ADMIN");
    auth.authenticationProvider(provider);
}

Однако этот код приводит к тому, что структура сначала пытается выполнить мою пользовательскую реализацию. Это имеет смысл, поскольку метод AuthenticationManagerBuilder#authenticationProvider добавляет провайдера во внутренний список, а AuthenticationManagerBuilder#inMemoryAuthentication один настраивает его внутренне. Как мне удалось заставить его работать?

4b9b3361

Ответ 1

Вы можете создать свой InMemoryUserDetailsManagerConfigurer вручную и сообщить ему, чтобы он настроил себя на AuthenticationManagerBuilder, когда вы закончили его настройку, чтобы установить его AuthenticationProvider перед своим пользовательским:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth,
        AuthenticationProvider provider) throws Exception {

    inMemoryConfigurer()
        .withUser("admin")
            .password("s3cr3t")
            .authorities("ADMIN")
        .and()
        .configure(auth);
    auth.authenticationProvider(provider);
}

private InMemoryUserDetailsManagerConfigurer<AuthenticationManagerBuilder>
        inMemoryConfigurer() {
    return new InMemoryUserDetailsManagerConfigurer<>();
}

Обычно происходит то, что InMemoryUserDetailsManagerConfigurer создается и добавляется в список конфигураторов, который должен применяться при создании AuthenticationManager, который после установки вашего пользовательского AuthenticationProvider.

Ответ 2

Более или менее от spring.io Документация

Если вы используете конфигурацию XML (например, spring -security.xml):

<security:authentication-manager>
    <security:authentication-provider ref="FirstProvider" />
    <security:authentication-provider ref="SecondProvider" />
</security:authentication-manager>

(Я использую эту настройку для одного из Spring встроенного поставщика проверки подлинности рядом с пользовательским, прекрасно работает)

Если вы используете Java Config, я могу ссылаться только на другое сообщение maclema на конфигурацию Java для нескольких поставщиков проверки подлинности, так как я никогда (успешно) не пробовал код конфигурации