我们有一个通过AuthenticationProvider实现自定义身份验证的webapp。 这现在工作正常。但我们希望为客户提供一个选项来实现自己的身份验证类,实现AuthenticationProvider。所以他们会从app中删除我们的jar并将他们的jar添加到classpath。
它出现在security 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的类吗?
答案 0 :(得分:1)
也许您可以使用类型自动装配和工厂方法来实现:
1 - CustomAuthenticationProvider
它将通过类型自动装配注入,该类型仅在客户端添加的jar和已删除的jar中定义(它必须是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>
!!!!已删除的jar和新jar必须具有相同的applicationContext.xml
名称(声明AuthenticationProvider
的位置)才能使替换工作。
<import resource="applicationContextAuthProvider.xml"/>