让Spring安全选择实现自定义身份验证提供程序的类

时间:2016-10-06 04:22:09

标签: spring spring-security spring-java-config custom-authentication

我们有一个通过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的类吗?

1 个答案:

答案 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"/>