密码错误冻结时间,强制修改密码时间,密码强度,首次登录是否修改密码

news2024/12/29 10:00:38

新建单表,各种字段,项目启动时加载到redis缓存中。问题:修改数据后,缓存中数据未修改?是否设置超时时间,每次登录的时候判断缓存中有没有,没有新增一次,有了就用缓存中数据?

1、java 应用启动时将数据加入到缓存中

@PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。

  • 只有一个非静态方法能使用此注解;
  • 被注解的方法不得有任何参数;
  • 被注解的方法返回值必须为void;
  • 被注解方法不得抛出已检查异常;
  • 此方法只会被执行一次;
/**
     * 应用启动时将数据加入到缓存中
     */
    @PostConstruct
    public void loadDlpzglIntoRedis() {
        QueryWrapper<SysDlpzgl> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("sfsc", "N");
        SysDlpzgl sysDlpzgl = sysDlpzglService.getOne(queryWrapper);
        // 缓存数据到Redis
        log.info("登录配置管理存储字典到redis" + sysDlpzgl.toString());
        redisUtil.set(DLPZGL, sysDlpzgl);
    }

2、判断是否开启首次登录修改密码

.....
...
..
//判断是否开启首次登录修改密码
        if ("1".equals(sysDlpzgl.getSfkqscdlxgmm()) && isFirstLogin(username)){
            return result.error500("首次登录请修改密码!");
        }
.......
.....
...


/**
     * 首次登录是否修改密码
     * @return
     */
    private boolean isFirstLogin(String username) {
        SysUser user = sysUserService.getUserByName(username);
        Date zhmmzhxgsj = user.getZhmmzhxgsj();//账号密码最后一次修改时间
        Date createTime = user.getCreateTime();
        //获取距离最后一次密码修改的时间,天数
        //long day = DateUtil.betweenDay(createTime, zhmmzhxgsj, false);
        //判断两个时间是否相等
        if (!createTime.equals(zhmmzhxgsj)) {
            return false;
        } else {
            return true;
        }
    }

3、检查用户密码是否为弱口令,密码强度

@GetMapping("/isWeakPassword")
    private Result<String> isWeakPasswordInterface(String encodePassword) throws Exception {
        SysDlpzgl sysDlpzgl = (SysDlpzgl) redisUtil.get("dlpzgl");
        //解密密文密码
        String password = new String(RSAUtils.decryptByPrivateKey(encodePassword, privateKey));
        Map<String, Object> resMap = new HashMap<>();
        boolean isWeak = false;
        Map<String, String> map = new HashMap<String, String>();
        String message = "密码不符合规范:";
        int dxzmNum = 0;
        int xxzmNum = 0;
        int szNum = 0;
        int tszfNum = 0;
        for (int i = 0; i < password.length(); i++) {
            int A = password.charAt(i);
            if (A >= 48 && A <= 57) {// 数字
                map.put("数字", "数字");
                szNum++;
            } else if (A >= 65 && A <= 90) {// 大写
                map.put("大写", "大写");
                dxzmNum++;
            } else if (A >= 97 && A <= 122) {// 小写
                map.put("小写", "小写");
                xxzmNum++;
            } else {
                map.put("特殊", "特殊");
                tszfNum++;
            }
        }

        int pwdLength = password.length();// 密码长度
        if (pwdLength <= Integer.parseInt(sysDlpzgl.getMmzxcd()) || pwdLength >= Integer.parseInt(sysDlpzgl.getMmzdcd())){
            message += "密码长度不符合规定!";
            return Result.error(500, message);
        }
        //如果开启包含大写字母
        if ("1".equals(sysDlpzgl.getSfbhdxzm())){
            //如果没有大写字母
            if (!"大写".equals(map.get("大写"))){
                message += "密码中不包含大写字母!";
                return Result.error(500, message);
            }
            //判断大写字母个数
            if (dxzmNum<Integer.parseInt(sysDlpzgl.getDxzmzsgs())){
                message += "密码中包含大写字母个数少于设定值!";
                return Result.error(500, message);
            }

        }
        //如果开启包含小写字母
        if ("1".equals(sysDlpzgl.getSfbhxxzm())){
            if (!"小写".equals(map.get("小写"))){
                message += "密码中不包含小写字母!";
                return Result.error(500, message);
            }
            if (xxzmNum<Integer.parseInt(sysDlpzgl.getXxzmzsgs())){
                message += "密码中包含小写字母个数少于设定值!";
                return Result.error(500, message);
            }

        }

        if ("1".equals(sysDlpzgl.getSfbhsz())){
            if (!"数字".equals(map.get("数字"))){
                message += "密码中不包含数字!";
                return Result.error(500, message);
            }
            if (szNum<Integer.parseInt(sysDlpzgl.getSzzsgs())){
                message += "密码中包含数字个数少于设定值!";
                return Result.error(500, message);
            }
        }

        if ("1".equals(sysDlpzgl.getSfbhtszf())){
            if (!"特殊".equals(map.get("特殊"))){
                message += "密码中不包含特殊!";
                return Result.error(500, message);
            }
            if (tszfNum<Integer.parseInt(sysDlpzgl.getTszfzsgs())){
                message += "密码中包含特殊字符个数少于设定值!";
                return Result.error(500, message);
            }
        }

        //判断字符串大写字母连续个数小写字母连续个数数字连续个数特殊字符连续个数
        int[] counts = countConsecutiveCharacters(password);
        for (int count : counts) {
            if (count > Integer.parseInt(sysDlpzgl.getTlxlxgs())){
                message += "密码中同类型连续个数大于设定值!";
                return Result.error(500, message);
            }
        }
        return Result.OK("密码符合规范!");


        //Set<String> sets = map.keySet();
        //int pwdSize = sets.size();// 密码字符种类数
        //int pwdLength = password.length();// 密码长度
        //if (pwdSize == 4 && pwdLength >= 6) {
        //    return Result.OK("密码符合规范!");
        //} else {
        //    if (!"数字".equals(map.get("数字"))) {
        //        message += "密码中不包含数字!";
        //        return Result.error(500, message);// 弱密码
        //    } else if (!"大写".equals(map.get("大写"))) {
        //        message += "密码中不包含大写字母!";
        //        return Result.error(500, message);// 弱密码
        //    } else if (!"小写".equals(map.get("小写"))) {
        //        message += "密码中不包含小写字母!";
        //        return Result.error(500, message);// 弱密码
        //    } else if (!"特殊".equals(map.get("特殊"))) {
        //        message += "密码中不包含特殊字符!";
        //        return Result.error(500, message);// 弱密码
        //    } else {
        //        return Result.error(500, message);// 弱密码
        //    }
        //}
    }

4、判断字符串大写字母连续个数小写字母连续个数数字连续个数特殊字符连续个数

/**
     *  判断字符串大写字母连续个数小写字母连续个数数字连续个数特殊字符连续个数
     * @param input
     * @return
     */
    public int[] countConsecutiveCharacters(String input) {
        String upperCasePattern = "[A-Z]+";
        String lowerCasePattern = "[a-z]+";
        String digitPattern = "\\d+";
        String specialCharPattern = "[^A-Za-z0-9]+";

        Pattern upperCaseMatcher = Pattern.compile(upperCasePattern);
        Pattern lowerCaseMatcher = Pattern.compile(lowerCasePattern);
        Pattern digitMatcher = Pattern.compile(digitPattern);
        Pattern specialCharMatcher = Pattern.compile(specialCharPattern);

        Matcher matcher;
        String type;
        int[] counts = new int[4];

        matcher = upperCaseMatcher.matcher(input);
        while (matcher.find()) {
            type = "Uppercase";
            counts[0] = matcher.group().length();
            System.out.println(type + " consecutive characters: " + counts[0]);
        }

        matcher = lowerCaseMatcher.matcher(input);
        while (matcher.find()) {
            type = "Lowercase";
            counts[1] = matcher.group().length();
            System.out.println(type + " consecutive characters: " + counts[1]);
        }

        matcher = digitMatcher.matcher(input);
        while (matcher.find()) {
            type = "Digit";
            counts[2] = matcher.group().length();
            System.out.println(type + " consecutive characters: " + counts[2]);
        }

        matcher = specialCharMatcher.matcher(input);
        while (matcher.find()) {
            type = "Special Character";
            counts[3] = matcher.group().length();
            System.out.println(type + " consecutive characters: " + counts[3]);
        }
        return counts;
    }

5、检查用户最后一次密码修改时间是否在规定时间内

/*检查用户最后一次密码修改时间是否在规定时间内*/
    private boolean isCheckPasswordExpire(SysUser sysUser) {
        Date zhmmzhxgsj = sysUser.getZhmmzhxgsj();
//        获取距离最后一次密码修改的时间,天数
        long day = DateUtil.betweenDay(zhmmzhxgsj, new Date(), false);
        SysDlpzgl sysDlpzgl = (SysDlpzgl) redisUtil.get("dlpzgl");
        int changeDay = Integer.parseInt(sysDlpzgl.getQzxgmmsj());
        if (day > changeDay) {
            return true;
        } else {
            return false;
        }
    }

系统增加登录管理,可配置,密码错误冻结时间,强制修改密码时间,密码强度,首次登录是否修改密码等

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

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

相关文章

牛客NC179 长度为 K 的重复字符子串【simple 哈希,滑动窗口 C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/eced9a8a4b6c42b79c95ae5625e1d5fd 思路 哈希统计每个字符出现的次数。没在窗口内的字符要删除参考答案C class Solution {public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c…

‍ 太空网络攻击

&#x1f9d1;‍&#x1f680; 尤里-加加林成为征服外太空的第一人。他在 1961 年 4 月 12 日的飞行有力地推动了全世界的科技发展。 有趣的事实是&#xff1a;苏联所有首次太空发射&#xff08;包括加加林的飞行&#xff09;的弹道计算都是在苏联第一个计算机中心的电子计算机…

Redis(六) Set集合类型

文章目录 前言命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREM集合间操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 命令小结 内部编码使用场景 前言 集合类型也是保存多个字符串类型的元素的&#xff0c;和列表类型不同的是&#xff0c;set集合类型中的元素是无序的且…

Flink 实时数仓(一)【实时数仓离线数仓对比】

前言 昨天技术面的时候&#xff0c;面试官说人家公司现在用的都是最新的技术&#xff0c;比如 Doris 等一些最新的工具&#xff0c;确实这些课是学校永远不会开设的&#xff0c;好在他说去了会带着我做一做。可是 ...... 学院舍不得让走啊 ...... 没办法&#xff0c;情况就是这…

DelphiWebMVC对VUE导出包的支持

MVC框架除了本身对html文件的渲染输出&#xff0c;先开始对Hbuilder或VSCode 开发的VUE项目的导出包&#xff0c;开始支持导出包的部署。 这是一个Hbuilder 的vue 项目&#xff0c;导出包为&#xff1a; 这是一个DelphiWeb项目&#xff0c; 这是DelphiWeb项目的运行目录&#x…

企业有必要上人事档案信息管理系统吗

人事档案是企业的重要资产&#xff0c;其中包含着员工的基本信息、合同、培训记录、绩效评估、离职手续等重要内容。通过建立人事档案信息管理系统&#xff0c;企业可以实现以下几点好处&#xff1a; 1. 提高工作效率&#xff1a;人事档案管理系统可以实现信息的集中存储和快速…

C语言操作符和关键字

文章目录 操作符单目操作符sizeof&#xff08;类型&#xff09;强制类型转换 关系操作符、逻辑操作符、条件操作符逗号表达式 常见关键字typedefstaticstatic修饰局部变量static修饰全局变量static修饰函数 register寄存器关键词define定义常量和宏 操作符 单目操作符 C语言中…

Echarts异步数据与动画加载

目录 简介 头部代码 这段代码是使用 Echarts 绘制图表的关键部分。首先&#xff0c;初始化了一个 Echarts 实例。然后&#xff0c;通过 Ajax 请求获取数据&#xff0c;并基于此设置图表选项。其中包括颜色、背景色、标题、提示框、图例以及饼图的具体配置。 具体解释如下&a…

python ERA5 画水汽通量散度图地图:风速风向矢量图、叠加等高线、色彩分级、添加shp文件、添加位置点及备注

动机 有个同事吧&#xff0c;写论文&#xff0c;让我帮忙出个图&#xff0c;就写了个代码&#xff0c;然后我的博客好久没更新了&#xff0c;就顺便贴上来了&#xff01; 很多人感兴趣风速的箭头怎样画&#xff0c;可能这种图使用 NCL 非常容易&#xff0c;很多没用过代码的小…

「 网络安全常用术语解读 」软件物料清单SBOM详解

1. 概览 软件物料清单&#xff08;Software Bill of Materials&#xff0c;SBOM&#xff09;是软件成分信息的集合&#xff0c;SBOM文件中记录了软件产品或服务所使用组件、库、框架的清单&#xff0c;用于描述软件构建过程中使用的所有组件及其关系&#xff0c;以实现软件供应…

fatal: unable to access ‘https://github.com/alibaba/flutter_boost.git/

Git error. Command: git fetch stdout: stderr: fatal: unable to access ‘https://github.com/alibaba/flutter_boost.git/’: Failed to connect to github.com port 443 after 75005 ms: Couldn’t connect to server exit code: 128 GitHub (国际型)代码 分发平台/托管平…

人工智能中两个较为常见的评估模型性能指标(EVS、MAE)

1、解释方差(EVS) 官方社区链接&#xff1a;sklearn.metrics.explained_variance_score-scikit-learn中文社区 explained_variance_score是一个用于评估回归模型性能的指标&#xff0c;它衡量的是模型预测值与实际值之间关系的密切程度。具体来说&#xff0c;解释方差分数表示…

【Canvas与艺术】绘制铜质钢底24周年纪念章

【关键点】 底图的查找和多次尝试、文字描边。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>使用HTML5/Canvas绘…

图像处理的基本操作

一、PyCharm中安装OpenCV模块 二、读取图像 1、基本语法 OpenCV提供了用于读取图像的imread()方法&#xff0c;其语法如下&#xff1a; image cv2.imread&#xff08;filename&#xff0c;flags&#xff09; &#xff08;1&#xff09;image&#xff1a;是imread方法的返回…

OpenCompass 大模型评测实战——笔记

OpenCompass 大模型评测实战——笔记 一、评测1.1、为什么要做评测1.2、如何通过能力评测促进模型发展1.2.1、面向未来拓展能力维度1.2.2、扎根通用能力1.2.3、高质量1.2.4、性能评测 1.3、评测的挑战1.3.1、全面性1.3.2、评测成本1.3.3、数据污染1.3.4、鲁棒性 二、OpenCompas…

MSE实现全链路灰度实践

技术架构包括以下基础设施和云服务&#xff1a; 1个地域&#xff1a;ACK集群、微服务应用、MSE实例均部署在同一地域下。 1个专有网络VPC&#xff1a;形成云上私有网络&#xff0c;确保核心云资源的网络环境&#xff0c;如容器服务ACK、微服务引擎MSE。 ACK集群&#xff1a;简单…

开曼群岛:Web3企业的乐园

开曼群岛&#xff1a;Web3企业的理想之地 开曼群岛&#xff0c;在数字革命中大放异彩。近年来&#xff0c;该地区成立的Web3企业数量显著增加&#xff0c;如果保持目前的发展速度&#xff0c;并持续优化立法&#xff0c;那么扩展的速度将无可限量。本文将探讨推动这一增长的关…

STL-vector的使用及其模拟实现

在C中&#xff0c;vector是标准模板库&#xff08;STL&#xff09;中的一种动态数组容器&#xff0c;它可以存储任意类型的元素&#xff0c;并且能够自动调整大小。vector提供了许多方便的成员函数&#xff0c;使得对数组的操作更加简单和高效。 vector的使用 vector的构造函数…

国密SSL证书在等保、关保、密评合规建设中的应用

在等保、关保、密评等合规建设中&#xff0c;网络和通信安全方面的建设是非常重要的部分&#xff0c;需要实现加密保护和安全认证&#xff0c;确保传输数据机密性、完整性以及通信主体可信认证。国密SSL证书应用于等保、关保和密评合规建设中&#xff0c;不仅能够提升网络信息系…

创建第一个Vue3项目时遇到的报错及处理

其实主要就是针对命令&#xff1a;npm init vuelatest 的报错处理 受限自己电脑本身已经安装了node&#xff0c;npm&#xff0c;在环境搭建时&#xff0c;遇到了报错&#xff0c;如下&#xff1a; 我以为是这是个很简单的问题&#xff0c;看起来是npm的版本过低&#xff0c;升…