0

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

它出现在安全 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的类吗?

4

1 回答 1

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"/>
于 2016-10-07T15:22:59.443 回答