Выполнение мульти-провайдера, даже если предыдущий успешно выполняется в WebSecurityConfigurerAdapter - PullRequest
0 голосов
/ 18 апреля 2019

Я новичок в Spring и настраиваю Аутентификацию в своем приложении. Мне нужно выполнить два поставщика, если и только если первый выполняется успешно.

Проблема: когда первый провайдер аутентифицирован, второй не выполняется. Сначала я использую 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);
    }



}

Спасибо за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...