即使第一个提供程序失败,Spring Security也会调用另一个身份验证提供程序

时间:2017-02-09 09:48:22

标签: java spring authentication spring-security

我在Spring Security中使用了身份验证提供程序。我有两个身份验证提供程序:LocalAuthenticationProviderRemoteAuthenticationProvider。身份验证流程是

  1. 应用程序检查本地数据库的凭证
  2. 如果传递了本地身份验证,则需要调用RESTful Web服务进行身份验证 凭证。
  3. 如果本地身份验证失败,请假设 身份验证失败并回复401
  4. @Override
    protected void configure(
        AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(localProvider).authenticationProvider(remoteProvider);
    }
    
    如果凭据失败,则

    LocalAuthenticationProvider抛出AuthenticationException。如果凭据为passed,则会返回null

    我的问题是Spring Security Framework调用RemoteAuthenticationProvider甚至LocalAuthenticationProviderfailed

    当我从RemoteAuthenticationProvider提供商列表中删除AuthenticationManagerBuilder时,即使LocalAuthenticationProvider failed也是如此。

    我想知道如何实现此身份验证流程。这两个提供商相互依赖。

1 个答案:

答案 0 :(得分:1)

查看ProviderManager的Javadoc,如果您的第一个提供者要抛出AccountStatusException,那么身份验证将无法进入第二个提供者:

http://docs.spring.io/autorepo/docs/spring-security/4.0.3.RELEASE/apidocs/org/springframework/security/authentication/ProviderManager.html

  

此过程的例外[提供程序在一次通过之前按顺序调用]是提供程序抛出的时间   AccountStatusException在这种情况下,列表中没有其他提供商   将被查询