执行多个提供程序,甚至前一个在WebSecurityConfigurerAdapter中成功执行

时间:2019-04-18 20:12:25

标签: java spring spring-security

我是spring的新手,正在我的应用程序中设置Authentication。当且仅当第一个成功执行时,我才需要执行两个提供程序。

问题:第一个提供程序通过身份验证后,第二个未执行。我首先使用ActiveDirectoryLdapAuthenticationProvider,然后需要执行CustomProvider。

那是我的代码:

@Configuration
@EnableWebSecurity
public class AdWebSecurity extends WebSecurityConfigurerAdapter {

  ...

  @Override
  public void configure(AuthenticationManagerBuilder auth) throws Exception 
  {
      //ActiveDirectoryLdapAuthenticationProvider
      auth.authenticationProvider(AdAuthConfig.getLdapProvider());

      //CustomProvider
      auth.authenticationProvider(AdAuthConfig.getDbProvider());        

  }
}
//LDAP Provider
public static ActiveDirectoryLdapAuthenticationProvider getLdapProvider()
{
    ActiveDirectoryLdapAuthenticationProvider adProvider = 
        new ActiveDirectoryLdapAuthenticationProvider(AD_DOMAIN, AD_URL);

        adProvider.setConvertSubErrorCodesToExceptions(true);
        adProvider.setUseAuthenticationRequestCredentials(true);

        adProvider.setSearchFilter(USER_PATTERN);
        adProvider.setUserDetailsContextMapper(userDetailsContextMapper());

        return adProvider;
    }
//CustomAuthenticationProvider
@Component
public class CustomAuthenticationProvider
    implements AuthenticationProvider {

    @Autowired
    private AuthenticationService service;

    @Override
    public Authentication authenticate( Authentication authentication ) throws AuthenticationException {

        String password = authentication.getCredentials().toString();

        //AdUserDetails is a custom UserDetail
        AdUserDetails userDetails = (AdUserDetails) authentication.getPrincipal();

        boolean authenticated = 
                service.authenticateEmployeeNumber(userDetails.getEmployeeNumber());

        authentication.setAuthenticated(authenticated);

        if(!authenticated) {

            throw new BadCredentialsException("Employee Number(" + 
                    userDetails.getEmployeeNumber() + 
                    "not found!"); 
        }

        return new UsernamePasswordAuthenticationToken(userDetails, password);

    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }



}

感谢您的时间。

0 个答案:

没有答案