【CAS框架自定义登录异常提示-固定时间内限制登录失败次数提醒】

news2024/11/16 8:51:58

CAS框架自定义登录异常提示

  • CAS框架自定义登录异常提示
    • cas自定义异常
      • 自定义异常的步骤-三步走
        • 1定义自定义异常类
        • 2配置文件配置
        • 3逻辑代码中抛出自定义异常
        • 总结
      • 自定义异常显示失败问题查找
    • 自定义异常带msg参数不显示问题处理
    • 最后

CAS框架自定义登录异常提示

本地CAS框架异常提示信息走国际化配置文件。CAS框架提供的系统异常比较少,新增多类型的自定义异常(继承系统异常),细化提示。
CAS框架版本5.3.14

cas自定义异常

只是参照别人实现自定义异常提示的步骤,还没有对源码怎么解读。照猫画虎罢了。
此模块包含固定时间内限制登录失败次数提醒(5分钟内,登录失败3次,给出第几次失败,几秒后再重试提醒)

自定义异常的步骤-三步走

1定义自定义异常类

在项目exception文件夹下添加自定义异常类PasswordErrOneException(名字自己随便定义,注意不要和框架中的关键字段重名就好)
类体如下
1继承类(怀疑是固定写法,暂未确认,但这样写能用)及类的内容都是参照别人的代码的。
2serialVersionUID和其他自定义异常类重复也不影响

package com.cas.exception;


import javax.security.auth.login.AccountException;

/**
 * 密码错误1一次异常
 *
 */
public class PasswordErrOneException extends AccountException {

    private static final long serialVersionUID = -3653822412344340111L;

    public PasswordErrOneException() {
        super();
    }

    public PasswordErrOneException(String msg) {
        super(msg);
    }
}
2配置文件配置

application.properties配置文件中添加如下配置自定义异常(应该是固定写法)
1有多个自定义异常用,隔开
2国际化文件配置
在这里插入图片描述

cas.authn.exceptions.exceptions=com.cas.exception.PasswordErrOneException,com.cas.exception.PasswordErrFiveException

message_zh_CN.properties中添加

//固定写法为authenticationFailure.自定义异常类名=配置的固定提示,如密码错误一次的中文的unicode码(可搜索在线unicode转码工具)
//本人IDEAunicode码就是显示码,看别人的可以直接显示对应中文,估计是有啥插件吧(猜的)
authenticationFailure.PasswordErrOneException=\u767b\u5f55\u5931\u8d25\u0031\u6b21\u002c\u8fde\u7eed\u767b\u5f55\u5931\u8d25\u0035\u6b21\u002c\u5c06\u88ab\u7981\u7528
3逻辑代码中抛出自定义异常

所在逻辑代码中添加抛出自定义异常

if (!passwordEncoder.matches(password, map.getOrDefault("pwd", StrUtil.EMPTY).toString())) {
            //一段时间内连续登录失败N次,给出具体提示
            respStr = disableUsername(username,false);
            throw new PasswordErrorException("密码错误,"+respStr);
 }
/**
     * 5分钟内登录失败3次,锁定账号
     *
     * @param username 用户名
     * @param flag 是否--业务逻辑,与锁定逻辑无关,参考可去除
     */
    private String disableUsername1(String username,Boolean flag) throws PasswordErrOneException,PasswordErrFiveException {
        //是否第一次登录失败,是创建缓存,否数值+1
        String cacheKey = "loginfail" + username;
        Integer cacheValue = (Integer) redisTemplate.opsForValue().get(cacheKey);
        if (ObjectUtil.isEmpty(cacheValue)) {
            //用秒比较精确
            redisTemplate.opsForValue().set(cacheKey, 1, 3*60, TimeUnit.SECONDS);
            return "已登录失败1次,连续登录失败5次,账号将被锁定";
        }
        //判断数值是否为3,为3直接锁定用户,并且销毁
        cacheValue = cacheValue +1;
        if(cacheValue >= 5) {
            //为3直接禁用用户
            if(flag){
                //锁定用户
                lockUsername(username);
            }
            //销毁缓存-后续不影响用户解锁后登录
            redisTemplate.delete(cacheKey);
            return "登录失败5次,账号已被锁定";
        }
        //为2 3 4 给出操作时间提示和第几次提示  查看剩余时间-https://blog.51cto.com/u_16213339/9207312(redis只更新KEY对应的值,不影响KEY的总过期时间)
        //1获取剩余秒数
        Long leftTime = redisTemplate.getExpire(cacheKey, TimeUnit.SECONDS);
        //2重置登录失败次数-此时KEY对应的过期时间应该为空(暂未核实,纯属猜测)
        redisTemplate.opsForValue().set(cacheKey, cacheValue);
        //3重新设置过期时间-使用剩余过期时间,以达到KEY总过期时间为3分钟无误
        redisTemplate.expire(cacheKey,leftTime, TimeUnit.SECONDS);
        return "已登录失败"+cacheValue+"次,连续登录失败5次,账号将被锁定!请于"+leftTime+"秒后再次登录";
    }
总结

如上配置好后,代码运行好后,理论上是可以提示国际化文件中配置的中文提示。还不能显示throw new PasswordErrorException(“密码错误,”+respStr);自定义类中传递的MSG参数(后续需要重写源码才行)

自定义异常显示失败问题查找

如上本来是应该至少显示自定义异常对应的国际化配置文件中的文字提示的(密码错误一次)。
但一直显示’认证信息失败‘
后续debug断点打是发现异常扔出还没到读配置文件的时候就报错了,所以实际最后扔出的异常是认证信息失败对应的异常(或UNKNOW类型的异常也是这个中文信息-可配置的-但俺还不会,没太深究)

自定义异常带msg参数不显示问题处理

自定义异常带msg参数不显示,只走固定配置国际化文件中的提示。
要改源码
参照https://blog.csdn.net/qq_43542296/article/details/128933103这个文档改的
1找不到源码位置,找的其他人给我截图的源码位置。找源码位置方法-debug然后下载相关源码。或直接全局导入源码(百度有文,但看不太懂,也没实操,后续看看)
2找到相关源码,创建和源码所在文件夹路径相同的文件夹(源码顶级和项目顶级文件夹同级-项目中是这样,但为啥这样不太懂,是不是一定呀这样也不太懂-应该是固定这样的)
3本地文件夹源码路径下创建同源码类名的类,然后复制源码代码覆盖本地源码类
4只改写需要的本地源码类中方法。其余本地源码类中方法保持不动(不能删)
5本地复制出源码类后,报错的源码代码中如果是未引入导致的,回源码中点看看缺失的文件所在JAR包,找到后,POM中添加引入看看
6其余本地源码类报错,暂时不太会处理,源码逻辑也是不太看的懂,不太找得到目标源码类及方法,后续精进

最后

断点是个好东西
读源码是个好东西,还不太会,后续精进,源码位置都找不到哈哈,debug也找不到目标源码,还好有百度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2167680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库进阶知识(四)《视图、存储过程、触发器》

学习目标: 掌握数据库视图基础知识 掌握数据库存储过程原理 掌握数据库触发器相关知识 学习内容: 一. 视图 介绍 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询…

Acwing 最小生成树

最小生成树 最小生成树:由n个节点,和n-1条边构成的无向图被称为G的一棵生成树,在G的所有生成树中,边的权值之和最小的生成树,被称为G的最小生成树。(换句话说就是用最小的代价把n个点都连起来) Prim 算法…

大疆会搞微单相机吗,直接和索尼、佳能、尼康竞争?

网传信息,不知道大疆后续是否真会考虑这块的业务。 在消费类电子的cmos领域,类似豪威、格科、斯特威等国产公司,已经有了一些突破。不过在高端的单反、微单领域,日本还是处于绝对的垄断地位。 2023年,全球cmos市场占有…

操作系统复习3 malloc如何分配内存

malloc分配内存 malloc是c语言的库函数,不支持重载 malloc的返回值是void*类型需要强制转换 malloc申请完的内存需要用free来进行释放内存 malloc申请空间失败会返回值为空 malloc申请的是虚拟内存地址,只有这块内存被访问时,才能发生映…

基于quill2.0的富文本编辑器,Fluent Editor,支持表格,图片,表情等

官网&#xff1a;Fluent Editor | 基于 Quill 2.0 的富文本编辑器 安装 npm i opentiny/fluent-editor quill 使用案例 <template><div class"publish-form-container"><!-- TODO --><div ref"quillEditorRef" class"quill…

comfyui 工作流生成图片使用history接口获取返回时 outputs为空 问题请教,希望有大佬可以帮忙解答一下

comfyui github地址&#xff1a; GitHub - comfyanonymous/ComfyUI: The most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface.The most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface.…

flush cache line dirty bytes

结论&#xff1a; ARM :To mark these lines, each line of the cache has an associated dirty bit (or bits) 所以这个依赖硬件实现&#xff0c;可能只刷出dirty bytes of cache line to memory.有的硬件只有一个dirty bit&#xff0c;所以会刷出整条cache line x86没有找…

1--苍穹外卖-SpringBoot项目介绍及环境搭建 详解

目录 软件开发整体流程 软件开发流程 角色分工 软件环境 苍穹外卖项目介绍 项目介绍 产品原型 技术选型 开发环境搭建 前端环境搭建 后端环境搭建 完善登录功能 导入接口文档 Swagger 介绍 使用方式 常用注解 软件开发整体流程 软件开发流程 需求分析&#x…

Supabase 入门指南

Supabase 是一个开源替代品&#xff0c;用于 Firebase 提供的后端服务。它基于 PostgreSQL&#xff0c;提供实时数据库、身份验证、存储等功能。本文将深入探讨 Supabase 的主要功能&#xff0c;并结合不同场景给出代码实例。 1. 创建 Supabase 项目 首先&#xff0c;访问 S…

Cannon-es物理引擎中物体动力控制的深度探索

本文目录 前言1、cannon-es给物体施加力1.1 前置代码1.2 效果1.3 给小球施加力1. applyForce效果 2. applyImpulse效果 3. applyLocalImpulse效果 4. applyTorque效果 区别总结 前言 在三维物理引擎的世界里&#xff0c;Cannon-ES以其轻量级和高效能著称&#xff0c;为开发者提…

寿司检测系统源码分享

寿司检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

zabbix“专家坐诊”第257期问答

问题一 Q&#xff1a;zabbix5.0监控项里的键值&#xff0c;怎么设置变量值&#xff1f;{#ABC} {$ABC} 都识别不到变量。 A&#xff1a;可以参考一下这个。 问题二 Q&#xff1a;我想问一下用odbc创建监控项&#xff0c;生成了json格式&#xff0c;如何创建一个触发器去判断里面…

精准控制交易亏损:掌握关键止损点设置技巧

前段时间&#xff0c;咱们探讨了开仓的策略&#xff0c;那今天就需要来聊聊止损的技巧了。一个好的开始很重要&#xff0c;但知道何时止损也是同样关键。市场波动大&#xff0c;机会稍纵即逝。当趋势变得不明确时&#xff0c;止损可以帮助我们管理风险&#xff0c;防止损失加剧…

Spring Cloud Gateway 之动态uri 自定义过滤器

背景&#xff1a;第三方公司 请求本公司入参和出参一样的同一个接口&#xff0c;根据业务类型不一样需要不同业务微服务处理 &#xff0c;和第三方公司协商在请求头中加入业务类型方便我公司在网关成分发请求。 1&#xff1a;在spring cloud gateway yml 中加入路由 重点是 -…

STL——map和set【map和set的介绍和使用】【multimap和multiset】

目录 map和set1.关联式容器2.键值对3.树形结构的关联式容器3.1set3.1.1set的介绍3.1.2set的使用3.1.2.1set的模版参数列表3.1.2.2set的构造3.1.2.3set的迭代器3.1.2.4set基本接口的使用3.1.2.5set使用案例 3.2map3.2.1map介绍3.2.2map的使用3.2.2.1map的构造3.2.2.2map的迭代器…

一个必会算法模型,XGBoost !!

大家好&#xff0c;今天咱们来聊聊XGBoost ~ XGBoost&#xff08;Extreme Gradient Boosting&#xff09;是一种集成学习算法&#xff0c;是梯度提升树的一种改进。它通过结合多个弱学习器&#xff08;通常是决策树&#xff09;来构建一个强大的集成模型。 XGBoost 的核心原理…

数据结构练习题————(二叉树)——考前必备合集!

今天在牛客网和力扣上带来了数据结构中二叉树的进阶练习题 1.二叉搜索树与双向链表———二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com) 2.二叉树遍历————二叉树遍历_牛客题霸_牛客网 (nowcoder.com) 3.二叉树的层序遍历————102. 二叉树的层序遍历 - 力扣&am…

C# 一键清空控件值

_场景&#xff1a;_在任何一个Form表单的操作页面或者数据台账的查询页面&#xff0c;基本都会看到一个清除的按钮&#xff0c;其功能就是用来清除我们需要抛弃的已经写入到控件内的数据。如果一个个控件来处理的话&#xff0c;想必会非常麻烦&#xff0c;而且系统不单单只是一…

杭州算力小镇:AI泛化解锁新机遇,探寻AI Agent 迭代新路径

人工智能技术不断迭代&#xff0c;重点围绕着两个事情&#xff0c;一是数据&#xff0c;二是算力。 算法的迭代推动着AI朝向多模态的方向发展&#xff0c;使之能够灵活应对不同领域的不同任务&#xff0c;模型的任务执行能力大大提升&#xff0c;人工智能泛化能力被推上高潮。…

scala 2.12 error: value foreach is not a member of Object

如图所示&#xff1a;在scala 2.11的时候下面的不报错&#xff0c;但是在2.12下报错了 在scala2.12环境下错误如下&#xff1a; 经过查找资料得到&#xff1a;df 后面加上rdd 即可