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

本文介绍如何修改CAS单点登录系统中密码错误时的默认提示信息。默认提示为'您提供的凭证有误',通常期望提示'密码错误'。通过修改messages_zh_CN.properties文件中的错误代码对应的消息,以及自定义异常处理类,可以实现自定义的错误提示。测试验证了配置的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值