CAS не может найти обработчик аутентификации, который поддерживает UsernamePasswordCredential - PullRequest
1 голос
/ 28 апреля 2019

У меня есть такой обработчик:

Public class DatabaseAuthenticationHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler {

  @Override
  protected AuthenticationHandlerExecutionResult authenticateUsernamePasswordInternal(
        UsernamePasswordCredential credential, String originalPassword) throws GeneralSecurityException,    PreventedException {

    final String username = credential.getUsername();
    logger.debug("***Username:"+username);
    logger.debug("***Password:"+credential.getPassword());
    return createHandlerResult(credential, new SimplePrincipal(), null);
  }

  @Override
  public boolean supports(final Credential credential)  {
    return true;
  }
}

Для меня это всегда должно входить в систему, несмотря ни на что. Но я вижу в логах это:

ERROR [org.apereo.cas.authentication.PolicyBasedAuthenticationManager] 
- <Authentication has failed. Credentials may be incorrect or CAS cannot find authentication handler that supports
[UsernamePasswordCredential(username=sadf, source=MyJDBCAuthenticationManager)] of type [UsernamePasswordCredential].
 Examine the configuration to ensure a method of authentication is defined and analyze CAS logs at DEBUG level to trace the authentication event.

, что не имеет смысла для меня, как я вижу в журналах, что cas вызывает метод authenticatUsernamePasswordInternal. Очевидно, этот обработчик поддерживает, ну все.

Почему я не могу войти?

1 Ответ

1 голос
/ 29 апреля 2019

Я думаю, вам лучше использовать principalFactory.createPrincipal для создания принципала, а не для возврата new SimplePrincipal().

. В вашем AuthenticationEventExecutionPlanConfigurer & DatabaseAuthenticationHandler добавьте следующее:

AuthenticationEventExecutionPlanConfigurer.java

    @Autowired
    @Qualifier("principalFactory")
    private PrincipalFactory principalFactory;

    @Bean
    public DatabaseAuthenticationHandler databaseAuthenticationHandler() {
         return new DatabaseAuthenticationHandler(principalFactory);
    }


DatabaseAuthenticationHandler

Public class DatabaseAuthenticationHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler {
  private final PrincipalFactory principalFactory;
  public DatabaseAuthenticationHandler (PrincipalFactory principalFactory){
     this.principalFactory = principalFactory;
  }

  @Override
  protected AuthenticationHandlerExecutionResult authenticateUsernamePasswordInternal(
        UsernamePasswordCredential credential, String originalPassword) throws GeneralSecurityException,    PreventedException {

    final String username = credential.getUsername();
    logger.debug("***Username:"+username);
    logger.debug("***Password:"+credential.getPassword());
    /////// below here's the change /////////
    return createHandlerResult(credential, this.principalFactory.createPrincipal(username), null);
  }

  @Override
  public boolean supports(final Credential credential)  {
    return true;
  }
}

Посмотрите, работает ли выше, спасибо.

...