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

本文介绍如何在CAS中自定义登录失败时的提示信息,包括通过修改异常处理逻辑及利用自定义异常来实现特定的错误提示。

摘要生成于 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;
    }
}
  • 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类,

这里写图片描述

这个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);
    }
}
  • 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

这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值