CAS找不到支持UsernamePasswordCredential的身份验证处理程序

问题描述 投票:1回答:1

我有这样的自定义处理程序:

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方法。显然这个处理程序支持一切。

为什么我不能登录?

cas
1个回答
1
投票

我认为你最好使用principalFactory.createPrincipal创建校长而不是返回new SimplePrincipal()

在您的AuthenticationEventExecutionPlanConfigurerDatabaseAuthenticationHandler中,添加以下内容:

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;
  }
}

看看上面是否有效,谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.