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

新建单表,各种字段,项目启动时加载到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;
        }
    }

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值