验证用户注册的用户名和密码是否安全且合规(上集)

需求如下:

1.用户名长度:3-20;密码长度:10-20

2.密码不能包含用户名、空格,不能有连续且重复的字符如11、aa

3.不区分大小写检查禁止字符串

4.密码复杂度:四选三(即大写、小写字母、数字、符号至少包含三种)

2.关于不能有连续且重复的字符,这样写不对

在Java中,String.matches() 方法是用于判断整个字符串是否完全匹配正则表达式所描述的模式。因此,如果使用 password.matches("(.)\\\\1+"),它会尝试匹配整个密码字符串是否仅由连续且重复的字符组成。所以这里需要用Matcher类中的find()方法查找匹配项。

完整代码如下:

public String register(RegisterBody registerBody) {
        String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword();
        SysUser sysUser = new SysUser();
        sysUser.setUserName(username);

        if (StringUtils.isEmpty(username)) {
            msg = "用户名不能为空";
        } else if (StringUtils.isEmpty(password)) {
            msg = "用户密码不能为空";
        } 
        // 1.用户名长度:3-20;密码长度:10-20
        else if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
            msg = "账户长度必须在3到20个字符之间";
        } else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                || password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
            msg = "密码长度必须在10到20个字符之间";
        } else if (!userService.checkUserNameUnique(sysUser)) {
            msg = "保存用户'" + username + "'失败,注册账号已存在";
        } 
        // 2.密码不能包含用户名、空格,不能有连续且重复的字符如11、aa
        else if (password.contains(username)) {
            msg = "密码不能包含账号";
        } else if (password.contains(" ")) {
            msg = "密码不能包含空格";
        } else if (containsConsecutiveRepeats(password)) {
            msg = "密码不能包含连续重复的数字或字母如11、aa";
        }
        // 3.不区分大小写检查禁止字符串
        else if (true) {
            String[] forbiddenStrings = {"wusite", "software", "industry"};
            for (String forbidden : forbiddenStrings) {
                if (password.toLowerCase().contains(forbidden))
                    msg = "密码中存在禁止字符串,请重新设置";
                else break;
            }
        }
        // 4.密码复杂性度:四选三
        int complexityCount = 0;
        if (password.matches(".*[a-z].*")) complexityCount++; // 包含小写字母
        if (password.matches(".*[A-Z].*")) complexityCount++; // 包含大写字母
        if (password.matches(".*\\d.*")) complexityCount++; // 包含数字
        if (password.matches(".*[!@#$%^&*()_+<>?].*")) complexityCount++; // 包含符号
        else if (complexityCount < 3)
        {
                msg = "密码中至少包含大写字母、小写字母、数字、符号中的三种";
        }
        else
        {
            sysUser.setNickName(username);
            sysUser.setPassword(SecurityUtils.encryptPassword(password));
            boolean regFlag = userService.registerUser(sysUser);
            if (!regFlag)
            {
                msg = "注册失败,请联系系统管理人员";
            }
            else
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success")));
            }
        }
        return msg;
    }

    private boolean containsConsecutiveRepeats(String password) {
        // 正则表达式,匹配任意字符的连续且重复
        String regex = "(.)\\1+";

        // 编译正则表达式
        Pattern pattern = Pattern.compile(regex);

        // 创建匹配器
        Matcher matcher = pattern.matcher(password);

        // 查找匹配项
        return matcher.find(); // 如果找到匹配项,则返回true
    }

添加对账号密码安全性和规范性的检查,是为了保护用户隐私和维护系统稳定。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值