Разрешение безопасности Spring выбрать реализацию класса, реализующего пользовательский поставщик аутентификации
У нас есть веб-приложение, которое реализует пользовательскую аутентификацию через AuthenticationProvider. Теперь это работает нормально. Но мы хотим предоставить клиенту возможность реализовать собственный класс аутентификации, реализующий AuthenticationProvider. Поэтому они удалят нашу банку из приложения и добавят ее в classpath.
Похоже, в xml безопасности нам нужно указать только класс, реализующий AuthenticationProvider, но не могу сказать Spring, чтобы выбрать какой-либо класс, реализующий интерфейс AuthenticationProvider.
Текущая реализация XML и класса
<authentication-manager alias="authenticationManager">
<authentication-provider ref="customAuthenticationProvider"/>
</authentication-manager>
<beans:bean id="customAuthenticationProvider" class="w.x.y.z.CustomAuthenticationProvider"></beans:bean
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
//Implementation
}
@Override
public boolean supports(Class<?> arg0) {
return true;
}
}
В любом случае я могу сказать Spring, чтобы выбрать любой класс, реализующий AuthenticationProvider?
1 ответ
Может быть, вы можете сделать это, используя тип autowiring и фабричный метод:
1-The CustomAuthenticationProvider
он будет введен по типу autowiring, определенному только в банке, добавленной вашим клиентом, и в удаленной банке (это должен быть ровно один экземпляр AuthenticationProvider
).
2-И затем используйте фабричный метод для внедрения этого провайдера в менеджер аутентификации.
1-й шаг
public class AuthenticationProviderFactory {
@Autowired
private AuthenticationProvider authProvider;
public AuthenticationProvider getAuthenticationProvider() {
return authProvider;
}
}
2-х секундный шаг
<bean name="authenticationProviderFactory"
class="w.x.y.z..AuthenticationProviderFactory"></bean>
<bean name="authenticationProvider" factory-bean="authenticationProviderFactory"
factory-method="getAuthenticationProvider">
</bean>
<authentication-manager alias="authenticationManager">
<authentication-provider ref="authenticationProvider"/>
</authentication-manager>
!!!! Удаленная банка и новая банка должны иметь одинаковые applicationContext.xml
имя (где AuthenticationProvider
заявлено) сделать замену работающей.
<import resource="applicationContextAuthProvider.xml"/>