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

Letting Spring security pick implementation of class implementing custom authentication provider

我们有一个 Web 应用程序,它通过 AuthenticationProvider 实现自定义身份验证。 这现在工作正常。但是我们想为客户提供一个选项来实现他们自己的身份验证 class 实现 AuthenticationProvider。所以他们将从应用程序中删除我们的 jar 并将他们的 jar 添加到 classpath.

它出现在安全性 xml 我们只需要指定 class 实现 AuthenticationProvider 但不能告诉 spring 选择任何 class 实现接口 AuthenticationProvider

当前 XML 和 Class 实施

<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 选择任何 class 实现 AuthenticationProvider 吗?

也许你可以通过使用类型自动装配和工厂方法来做到这一点:

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