В памяти и пользовательских провайдерах все вместе
Я настраиваю мое веб-приложение 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
один настраивает его внутренне. Как мне удалось заставить его работать?
Ответы
Ответ 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 для нескольких поставщиков проверки подлинности, так как я никогда (успешно) не пробовал код конфигурации