即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

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

编程语言 u010248330 90℃ 0评论

我们看一下如果登入密码不对,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("密码错误了!!!!!"));
    }

这里写图片描述

转载请注明:CodingBlog » CAS实现单点登入(三):登入提示消息修改

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情