CAS实现单点登入(三):登入提示消息修改

我们看一下如果登入密码不对,cas默认的提示消息是什么?

CAS实现单点登入(三):登入提示消息修改_第1张图片

密码不正确是默认提示的是:您提供的凭证有误

实际中我们看到的大都是:密码错误的提示。我们修改成我们自己想要的提示语。

因为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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

注意我们进入到这个BadPasswordAuthenticationException类,

CAS实现单点登入(三):登入提示消息修改_第2张图片

这个error.authentication.credentials.bad.usernameorpassword.password这个code并没有定义,所以还需要在messages_zh_CN.properties中定义这个:

CAS实现单点登入(三):登入提示消息修改_第3张图片

这样就配置完成了,

我们测试一下: 
CAS实现单点登入(三):登入提示消息修改_第4张图片

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

只需要在MyDefinedDBHandler的认证方法中密码认证失败时抛我们自己定义的异常MyDefinedAuthenticationException即可:

    if (!dbPassword.equals(encryptedPassword)) {
      throw new MyDefinedAuthenticationException(new Exception("密码错误了!!!!!"));
    }
  • 1
  • 2
  • 3
  • 4

CAS实现单点登入(三):登入提示消息修改_第5张图片

你可能感兴趣的:(项目开发)