我们看一下如果登入密码不对,cas默认的提示消息是什么?
密码不正确是默认提示的是:您提供的凭证有误。
实际中我们看到的大都是:密码错误的提示。我们修改成我们自己想要的提示语。
因为CAS异常处理逻辑是通过errorcode去messages_zh_CN.properties寻找已经中定义好的异常消息的。
我们默认的提示语:您提供的凭证有误可以在这个中文国际化文件中找到:
error.authentication.credentials.bad=您提供的凭证有误。
cas内置了一些处理异常的类
BadCredentialsAuthenticationException.java
BadPasswordAuthenticationException.java
BadUsernameOrPasswordAuthenticationException.java
所以我们只需要在验证的方法中,如果验证失败,抛出上面的异常就可以。
package com.mydefined.handler;
import javax.validation.constraints.NotNull;
import org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler;
import org.jasig.cas.authentication.handler.AuthenticationException;
import org.jasig.cas.authentication.handler.BadPasswordAuthenticationException;
import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
public class MyDefinedDBHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler {
@NotNull
private String sql;
protected final boolean authenticateUsernamePasswordInternal(
UsernamePasswordCredentials credentials)
throws AuthenticationException {
System.out.println("=========我们自己的处理器=======");
String username = getPrincipalNameTransformer().transform(
credentials.getUsername());
String password = credentials.getPassword();
String encryptedPassword = getPasswordEncoder().encode(password);
try {
String dbPassword = (String) getJdbcTemplate().queryForObject(sql,
String.class, new Object[] { username });
//===密码验证失败,抛出BadPasswordAuthenticationException===
if (!dbPassword.equals(encryptedPassword)) {
throw new BadPasswordAuthenticationException();
}
return dbPassword.equals(encryptedPassword);
} catch (IncorrectResultSizeDataAccessException localIncorrectResultSizeDataAccessException) {
}
return false;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
}
注意我们进入到这个BadPasswordAuthenticationException类,
这个error.authentication.credentials.bad.usernameorpassword.password这个code并没有定义,所以还需要在messages_zh_CN.properties中定义这个:
这样就配置完成了,
cas提供的内置的异常处理都是通过errorcode找到对应的提示语,并不支持直接抛出文字形式的异常消息。所以我们也可以自己定义一个异常处理类,可以直接抛文字形式的异常。
package com.mydefined.handler;
import org.jasig.cas.authentication.handler.AuthenticationException;
public final class MyDefinedAuthenticationException extends AuthenticationException{
/**
*
*/
private static final long serialVersionUID = 1L;
/**直接抛文字形式的异常
*throw new AuthenticationException(new Exception("自定义的异常消息"))
*/
public MyDefinedAuthenticationException(final Exception exception)
{
super(exception.getMessage());
}
/**
*跟cas内置的异常消息一样,通过error code去messages_zh_CN.properties中找已经定义好的异常消息
*/
public MyDefinedAuthenticationException(final String code)
{
super(code);
}
}
只需要在MyDefinedDBHandler的认证方法中密码认证失败时抛我们自己定义的异常MyDefinedAuthenticationException即可:
if (!dbPassword.equals(encryptedPassword)) {
throw new MyDefinedAuthenticationException(new Exception("密码错误了!!!!!"));
}