我有一个关于java编程语言的常规查询,以及它如何处理返回布尔值的异常和方法。
请注意,尽管以下示例涉及Spring / Ldap / ActiveDirectory,但我的问题仅涉及 java 和例外。
public boolean doAuthenticate(String userAndDomain, String password) {
UsernamePasswordAuthenticationToken userToken = new UsernamePasswordAuthenticationToken(replaceBackSlashWithAtSign(userAndDomain), password);
try {
Authentication authentication = adAuthenticationProvider.authenticate(userToken);
return authentication.isAuthenticated();
} catch (BadCredentialsException e) {
log.error("Authentication failed - wrong username\\password", e);
throw new BadCredentialsException("Authentication failed - wrong username\\password", e);
} catch (AuthenticationException e) {
log.error("Authentication failed - AuthenticationException", e);
throw new AuthenticationException("Authentication failed - AuthenticationException", e) { };
}
}
如果身份验证方法重新引发BadCredentialsException
或AuthenticationException
中的任何一个,那么doAuthenticate方法将返回false 。
但是如果出于某种原因<{>> adAuthenticationProvider.authenticate()
引发了另一个运行时异常,则该方法不会返回false,并且根本不会返回 ...
我很想知道为什么......
修改:
LdapAuthentifier authentifier = new LdapAuthentifierImpl();
boolean didAuthenticate = authentifier.doAuthenticate(VALID_USER, INVALID_PASSWORD);
System.out.println
{strong}的didAuthenticate
确实显示错误如果抛出了两个指定的异常中的一个,而另一个异常停止了程序的执行,而System.out.println
则是从未到过......
编辑2 :
public static void main(String[] args) {
LdapAuthentifier authentifier = new LdapAuthentifierImpl();
boolean didAuthenticate = authentifier.doAuthenticate(VALID_USER, INVALID_PASSWORD);
}
答案 0 :(得分:0)
我明白发生了什么。这是解释。
我在日志中实际看到的异常是BadCredentialsException
,但adAuthenticationProvider.authenticate
和永远不会抛出异常,因此以下方法永远不会重新抛出。
实际发生的是authentication.isAuthenticated()
只是返回false而我将此布尔值传递给客户端代码。
为了清楚起见,我再次提出这个方法:
@Override
public boolean doAuthenticate(String userAndDomain, String password) {
UsernamePasswordAuthenticationToken userToken = new UsernamePasswordAuthenticationToken(replaceBackSlashWithAtSign(userAndDomain), password);
try {
Authentication authentication = adAuthenticationProvider.authenticate(userToken);
return authentication.isAuthenticated();
} catch (BadCredentialsException e) {
log.error("Authentication failed - wrong username\\password", e);
throw new BadCredentialsException("Authentication failed - wrong username\\password", e);
} catch (AuthenticationException e) {
log.error("Authentication failed - AuthenticationException", e);
throw new AuthenticationException("Authentication failed - AuthenticationException", e) { };
}
}