在React应用程序中用RegEx测试密码强度

做者:Nic Raboy

翻译:疯狂的技术宅javascript

原文:https://www.thepolyglotdevelo...css

未经容许严禁转载前端

尽管一些组织认为应该由用户选择健壮的用户名和密码来保护本身,可是开发人员能够经过将规则包含在程序的设计中来帮助进行良好的密码选择。例如,开发人员能够经过加入进度条、百分比或颜色,来帮助用户在输入密码时规定密码的质量。java

许多人都知道弱密码很短,而且包含字母或数字,但毫不会同时包含二者。咱们也知道强密码包括符号以及区分大小写的字符。那么咱们如何在应用程序中检查这些内容呢?react

在本教程中,咱们将用正则表达式来测试密码的复杂性。这将经过 React 程序中的简单 JavaScript 来完成。程序员

要了解咱们要作的工做,请看下面的动画演示:面试

React 密码 RegEx 分析器

在咱们的示例中,背景颜色将随着密码强度的变化而变化。强度将由几种不一样的正则表达式测试方案来定义。正则表达式

建立一个 React Web 程序

为了使本教程简单易懂,咱们将会用 React CLI 工具建立一个新项目。执行如下命令建立一个新项目:segmentfault

npx create-react-app example-project

上面的命令会建立带有各类样板文件的 example-project目录。若是你安装了create-react-app CLI 工具,则能够跳过命令的 npx 部分。bash

打开项目的 src / App.js 文件,并包含如下代码:

import React from "react";
  
  class App extends React.Component {
      render() {
          return (
              <div>
                  <!-- Logic Here... -->
              </div>
          );
      }
  }
  
  export default App;

实际上咱们删除了 src / App.js 文件中的许多样板代码。请记住,目标是使该项目保持简单,以便于理解。

该项目的核心功能将会存在于其本身的组件中。

在项目内建立 src/components 目录,并在该目录内建立 passwordstrength.js 文件和 passwordstrength.css 文件。

将如下样板代码添加到 src/components/passwordstrength.js 文件中:

import React from "react";
  import "./passwordstrength.css";
  
  class PasswordStrength extends React.Component {
  
      constructor() {
          super();
          this.state = {}
      }
  
      render() {
          return ();
      }
  
  }
  
  export default PasswordStrength;

下一步,咱们将使用功能代码填充此文件。在开始添加核心逻辑以前,须要将 PasswordStrength 类添加到 src/App.js 文件中。该文件的内容以下所示:

import React from "react";
  import PasswordStrength from "./components/passwordstrength";
  
  class App extends React.Component {
      render() {
          return (
              <div>
                  <PasswordStrength></PasswordStrength>
              </div>
          );
      }
  }
  
  export default App;

咱们最终展现程序时,只会显示 PasswordStrength 类中的内容。你能够进行修改,可是在理解示例以后作起来更轻松。

用RegEx测试密码强度

在建立项目并生成全部必需的文件以后,如今咱们能够开始向程序添加核心逻辑了。打开项目的 src/components/passwordstrength.js 文件,并包含如下内容:

import React from "react";
  import "./passwordstrength.css";
  
  class PasswordStrength extends React.Component {
  
      constructor() {
          super();
          this.state = {
              backgroundColor: "#4285F4"
          }
          this.analyze = this.analyze.bind(this);
      }
  
      analyze(event) {}
  
      render() {
          return (
              <div style={{ backgroundColor: this.state.backgroundColor }}>
                  <p><label for="password">Password: </label></p>
                  <p><input type="text" name="password" onChange={this.analyze} /></p>
              </div>
          );
      }
  
  }
  
  export default PasswordStrength;

让咱们来分解一下从 constructor 方法开始的操做。由于咱们计划在组件的整个生命周期中更改背景颜色,因此须要在 state 中定义一个字段来完成该操做。该字段将表明实际的 CSS 属性,该属性将在更改时进行渲染。

由于咱们但愿逻辑完成后在函数中更改状态变量,因此要确保所讨论的函数具备程序上下文,这就是为何要使用 bind 函数的缘由。

在介绍 analyze 函数以前,先让咱们看一下 render 函数:

render() {
      return (
          <div style={{ backgroundColor: this.state.backgroundColor }}>
              <p><label for="password">Password: </label></p>
              <p><input type="text" name="password" onChange={this.analyze} /></p>
          </div>
      );
  }

父 HTML 元素带有背景样式,该样式将随着状态变量的改变而改变。从密码输入字段的更改事件中调用 analyze 功能。

因此让咱们来看一些繁重的工做。

咱们知道用于检查密码的正则表达式逻辑不会动态修改,因此把这些正则表达式定义为类外部的常量,把它们定义在 src/components/passwordstrength.js 文件中:

const strongRegex = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})");
const mediumRegex = new RegExp("^(((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{6,})");

那么这些正则表达式是什么意思呢?

让咱们经过下表说明事件流:

正则表达式 描述
^ 密码字符串将以这种方式开始
(?=.*[a-z]) 该字符串必须包含至少1个小写字母字符
(?=.*[A-Z]) 该字符串必须包含至少1个大写字母字符
(?=.*[0-9]) 该字符串必须至少包含1个数字字符
(?=.[!@#&dollar;%^&]) 该字符串必须至少包含一个特殊字符,可是为了不冲突,转义了 RegEx 保留字符。
(?=.{8,}) 字符串必须至少是八个字符。

上表是用于测试强密码的正则表达式的细节。能够将其修改成你所认为的强密码规则。

因为使用了 or 事件的 | 运算符,所以中等强度检查略有不一样。基本上咱们所说的是中等强度的密码,能够知足两个不一样的字符,同时具备特定的总体长度。

要真正进行测试,让咱们回到 analyze 函数:

analyze(event) {
      if(strongRegex.test(event.target.value)) {
          this.setState({ backgroundColor: "#0F9D58" });
      } else if(mediumRegex.test(event.target.value)) {
          this.setState({ backgroundColor: "#F4B400" });
      } else {
          this.setState({ backgroundColor: "#DB4437" });
      }
  }

首先,咱们检查输入字段中的文本是否为强密码,若是不是则检查是否为中等密码。若是二者都不是,则它是不合格的密码。

能够经过一些 CSS 进一步改进。打开项目的 src/components/passwordstrength.css 并包括如下内容:

.PasswordStrength {
      background-color: #4285F4;
      padding: 25px;
      color: #FFFFFF;
      font-weight: bold;
  }
  
  .PasswordStrength p {
      display: flex;
  }
  
  .PasswordStrength input {
      padding: 5px;
      flex-grow: 1;
      outline: none;
  }

若是你正确地完成了全部操做,则应该获得与本教程开始的动画相同的体验。

结论

你刚刚学到了如何用简单的 JavaScript 和正则表达式(RegEx)在 React 程序中测试密码强度。尽管 JavaScript 能够与任何框架一块儿工做,例如 AngularJS 示例中所演示的,这是你影响用户的一项强大功能。你正在影响他们为你的程序使用更健壮的密码,从而有助于防止它们被盗用。


本文首发微信公众号:前端先锋

欢迎扫描二维码关注公众号,天天都给你推送新鲜的前端技术文章

欢迎扫描二维码关注公众号,天天都给你推送新鲜的前端技术文章

欢迎继续阅读本专栏其它高赞文章:


相关文章
相关标签/搜索