regular expression,

用户名和密码规则的设计与正则表达式实现

DolorHunter DolorHunter Follow Jul 26, 2020 · 14 mins read

用户名和密码规则的设计与正则表达式实现
Share this

最近实习的过程中, 除了每天写写 API, DAO, Service, Controller 跟 Mapper, 额外做了一个判断用户名和密码是否符合规则的布尔方法. 一直觉得对于账号密码规则很熟悉, 毕竟每天都在注册登录, 不过自己实现了之后还是挺有意思的.

规则设计

为了满足系统和安全的要求, 我们需要设计一个特定的用户名和密码规则. 按照不同系统的安全需求等级, 设计出不同的用户名和密码规则.

此规则参照 NetApp - 管理访问控制角色中的用户名和密码规则设置. 因为我构建的系统安全要求不那么高, 因此在规则上做了一些简化, 实现起来也方便些. 以下加粗的内容为我实现的规则.

用户名规则

  • 用户名不能少于三个字符。
  • 用户名可以包含字母、数字、特殊字符或这三项的组合形式。
  • 对于本地用户名(配置了 password 或 publickey 身份验证方法的用户名),则还需遵循以下特殊字符规则:
    • 仅支持以下字符:_ . -
    • 用户名不能以连字符 (-) 开头。
  • 配置了 password 身份验证方法的用户名不能超过 16 个字符。
  • 配置了 snmp 应用程序类型的用户名不能超过 32 个字符。

密码规则

  • 密码不能包含用户名。
  • 密码不能少于八个字符。
  • 密码必须至少包含一个字母和一个数字。
  • 密码不能与最近使用过的六个密码相同。

规则实现

NetApp 提供的规则还是比较复杂的, 尤其是用户名的部分. 为了设计和实现的简单, 我只对长度和字符做了限制. 用户名为 3~16 位的数字或字母, 密码为 8~16 位的数字密码混合内容. 虽然没有很高的安全性, 但是也还不错.

为了实现的优雅, 我使用了正则的方式来判断用户名和密码是否符合规则. 如果用户名和密码符合, 则返回真, 否则返回假. 正则的实现需要注入 java.util.regex.Pattern 和 java.util.regex.Matcher 库的内容.

用户名合规判断实现

@Override
public boolean isUsername(UserVo userVo) {
  // TODO Auto-generated method stub
  String name=userVo.getUname();
  // 3~16位, 数字或字母
  String regex="^[0-9A-Za-z]{3,16}$";
  Pattern pattern=Pattern.compile(regex);
  Matcher matcher=pattern.matcher(name);
  return matcher.matches();
}

密码合规判断实现

@Override
public boolean isPassword(UserVo userVo) {
  // TODO Auto-generated method stub
  String password=userVo.getUpassword();
  // 8~16位, 数字字母混合
  String regex="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$";
  Pattern pattern=Pattern.compile(regex);
  Matcher matcher=pattern.matcher(password);
  return matcher.matches();
}

UserVo 是用户实体类. 我们先从中得到用户名或密码, 存放到字符串内. 之后再设计正则表达式 regex. 之后我们需要对正则表达式进行编译表示, 使用 Pattern.conpile(regex) 得到结果, 返回 Pattern 对象. 最后再使用 pattern.matcher(string) 对输入字符串进行解释和匹配操作, 结果返回 Matter 对象. 最后是否符合规则的结果就在 matcher.matches() 中, 符合为 true, 不符为 false.

正则表达式比较复杂, 可以参考 菜鸟教程 - Java 正则表达式正则表达式语法 部分. 表达式规则甚多, 我虽然用过好几次了, 不过至今自己也搞不清楚规则, 每次用的时候还得一通搜索找实例.

参考资料:

Join Newsletter
Get the latest news right in your inbox. We never spam!
DolorHunter
Written by DolorHunter
Developer & Independenet Blogger