So implementieren Sie einen Kennwortstärke-Detektor in React

So implementieren Sie einen Kennwortstärke-Detektor in React

Vorwort

Passwortstärke-Dateiprüfer; Bei der Registrierung eines Kontos müssen wir die aktuelle Passwortstärke des Benutzers auswerten. Für diesen Vorgang müssen wir einen Detektor erstellen. Am besten schreiben Sie ihn flexibel, damit das Produkt die Regeln bequem ändern kann.

Schauen wir uns zunächst die Wirkung an. Unten sehen Sie den Status entsprechend dem Screenshot.

verwenden

1 Parameterübergabe

const PasswordForce = passwordForce({ Eingabewert, Klassenname: 'password-force', });

2 Verwendung

<PasswordForce.Ansicht />

3 Überprüfung

Prüfen Sie, ob das Zeichen PasswordForce.invaildWord überschritten wird

Implementierungsbeispiel

Konfigurieren wir antd so, dass ein Prompter an das Kennworteingabefeld gebunden wird.

1 und 2 müssen nicht geändert werden, aber in der Praxis müssen wir den Wert der Eingabe überwachen und dann den Wert festlegen. So können wir eine Funktion definieren, die die Änderung des Wertes überwacht

const [Eingabewert, gesetzter Eingabewert] = useState('');
    const passwordChange = (Wert: Zeichenfolge) => {
    setInputValue(Wert);
};
const onPasswordInput = (e: beliebig) => {
    Passwortänderung(e?.Ziel?.Wert || '');
};

Dann binden Sie es einfach. Nach dem Binden können wir es normal anzeigen. Wenn jedoch ungültige Zeichen eingegeben werden, müssen wir sie durch einen Interceptor abfangen.

<Formular.Element
...
Regeln={[
    {
      erforderlich: wahr,
      Meldung: „Passwort nicht leer“,
    },
    ({ getFieldValue }) => ({
      validator(_, Wert) {
        Passwortänderung(Wert);
        wenn (PasswordForce.invaildWord) {
          returniere Promise.reject(
            neuer Fehler('Das Passwort enthält ungültige Zeichen.'),
          );
        }
        gibt Promise.resolve() zurück;
      },
    }),
]}
...

Okay, da wir jetzt mit der Verwendung des Slices fertig sind, implementieren wir es.

Komponentenschreiben

Komponenten schreiben

importieren {
  getRuleMatchResult,
  IpasswordForce,
  IpasswordRule,
  isMatchForceResultConfig,
  matchResultConfig,
  PasswortBreakKey,
} von '@/utils/passwordStrengthChecker';
importiere React, { CSSProperties } von „react“;
importiere { useEffect } von 'react';
importiere { useState } von „react“;
Importiere Stile aus „Stilkomponenten“;

Schnittstelleneigenschaften {
  Eingabewert: Zeichenfolge;
  Farbe?: Zeichenfolge;
  Stil?: CSS-Eigenschaften;
  Klassenname?: Zeichenfolge;
  benutzerdefinierteRegel?: IpasswordRule[];
}
Aufzählung ForceMap {
  high = "Hoch",
  Mitte = 'Mitte',
  low = "Niedrig",
}
const boolNumSum = (Liste: boolean[]) =>
  Liste.reduzieren<Zahl>(
    (vorherigerWert, aktuellerWert) =>
      aktuellerWert ? vorherigerWert + 1 : vorherigerWert,
    0,
  );

const passwordForce: (props: props) => {
  Ansicht: React.FC;
  aufgerufenes Wort: Boolesch;
  erzwingen: IpasswordForce;
} = ({ Eingabewert, Stil = {}, Klassenname, benutzerdefinierte Regel = [] }) => {
  const [force, setforce] = useState<IpasswordForce>(false);
  const [invaildWord, setIsInvaildWord] = useState(false);
  const Eingabewertlänge = Eingabewert?.Länge || 0;
  const setData = () => {
    setze Kraft (falsch);
    const isFirstWordUp = Eingabewert[0] === Eingabewert[0].toLocaleUpperCase();
    const ruleRsult = getRuleMatchResult(customRule, inputValue, undefiniert, '');
    const matchNum = boolNumSum(ruleRsult.list.map((e) => e[passwordBreakKey]));
    const matchResultConfig: matchResultConfig[] = [
      { min: 0, max: 32, matchNum: 1, Wert: "niedrig" },
      { min: 7, max: 32, matchNum: 2, Wert: 'Mitte' },
      { min: 7, max: 32, matchNum: 3, Wert: 'Mitte' },
      { min: 15, max: 32, matchNum: 3, Wert: ‚hoch‘, Bedarf: isFirstWordUp },
    ];
    setIsInvaildWord(ruleRsult.invaildWord);
    matchResultConfig.forEach((config) => {
      isMatchForceResultConfig(Konfiguration, Übereinstimmungsnummer, Eingabewertlänge) &&
        setforce(Konfigurationswert);
    });
  };
  useEffect(() => {
    Eingabewert? setData() : setforce(false);
  }, [Eingabewert]);
  zurückkehren {
    Ansicht: () =>
      Gewalt ? (
        <PasswordForceWrap {...{ Stil, Klassenname }}>
          {ForceMap[Kraft]}
        </PasswordForceWrap>
      ) : (
        <></>
      ),
    ungültiges Wort,
    Gewalt,
  };
};
Standard-PasswortForce exportieren;

const PasswordForceWrap = styled.span`
  Farbe: ${({ color }) => Farbe ?? '#000'};
`;

Datenstrukturanalyse

  • Liste Eine Sammlung von Regeln, von denen jede eine Übereinstimmung und einen Regelnamen sowie die Regeldaten selbst hat.
  • Mithilfe einer Karte können Sie bequem die den Regeln entsprechenden Daten abrufen.
  • matchCount ist die Anzahl der übereinstimmenden Zeichen
  • Mit invaildWord lässt sich feststellen, ob ungültige Zeichen vorhanden sind (Zeichen, die die in der Regel selbst angegebenen Zeichen überschreiten).

Prozessanalyse

Dabei handelt es sich eigentlich um zwei Prozesse

  • Die verarbeiteten Daten werden gemäß den Eingabewerten und Regeln abgerufen und die erhaltene Datenstruktur ist oben dargestellt.
  • Schreiben Sie dann die Konfigurationsdaten, die den Geschäftsanforderungen entsprechen, und geben Sie sie an die Funktion isMatchForceResultConfig weiter, um die Einstellungsstärke anzupassen

Äh. Das ist alles, was es zum Geschäftscode gibt. Dann sind die Abhängigkeiten die Codes, die grundsätzlich nicht geändert werden. Basierend auf den unten stehenden zugrunde liegenden Dateien können wir sehr komplexe Validatoren im Geschäftscode konfigurieren und diesen Teil des Codes in anderen Dateien implementieren.

Analyse des zugrunde liegenden Codes

Lass uns chatten.

Das Folgende ist reiner TS-Code, der jedes Framework ausführen kann.

passwordStrengthChecker.ts

importiere { Zahlenliste, Spezialliste, Wortliste } aus './Konstanten';

Typzuordnung = <U, T>(Option: {
  Array: U[];
  Bereich: Zahl;
  Übereinstimmungsliste: T[];
  tokenMap: (updateItem: T, token: U, index: Nummer) => T;
  Unterbrechungsschlüssel?: Zeichenfolge;
  ArrayMap?: (Element: U, Index: Zahl) => ungültig;
}) => T[];

/**
 * Array und Set abgleichen
 */
exportiere const setArrayMatch: map = ({
  Anordnung,
  Reichweite,
  Übereinstimmungsliste,
  Schlüssel abbrechen,
  TokenMap,
  ArrayMap,
}) => {
  const tokenLen = Array.Länge;
  für (let tokenIndex = tokenLen - 1; tokenIndex >= 0; tokenIndex--) {
    const arrayToken = array[tokenIndex];
    arrayMap && arrayMap(arrayToken, tokenIndex);
    für (let findIndex = Bereich - 1; findIndex >= 0; findIndex--) {
      Übereinstimmungsliste = Übereinstimmungsliste.map((Element) =>
        tokenMap(Element, Array-Token, Index finden),
      );
    }
    wenn (breakKey && !matchList.map((e) => (e wie jeder)[breakKey]).includes(false))
      brechen;
  }
  gibt Übereinstimmungsliste zurück;
};

exportiere const passwordBreakKey = "isMatch";
Exporttyp IpasswordRule = {
  Liste: Zeichenfolge[];
  isMatch: boolesch;
  Name: Zeichenfolge;
};
exportiere const defaultPasswordRuleList = [
  { Name: 'Spezial', Liste: Spezialliste },
  { Name: 'num', Liste: Zahlenliste },
  { Name: 'Wort', Liste: Wortliste },
];

Typ PickValue<T, K erweitert Schlüssel von T> = T[K];

exportiere const getRuleMatchResult: (
  benutzerdefinierte Regel: IpasswordRule[],
  Eingabewert: Zeichenfolge,
  Standardregel deaktivieren?: Boolesch,
  breakKey?: Zeichenfolge,
) => {
  Liste: IpasswordRule[];
  Karte: Karte<PickValue<IpasswordRule, 'name'>, boolean>;
  matchCount: Zahl;
  aufgerufenes Wort: Boolesch;
} = (benutzerdefinierte Regel, Eingabewert, Standardregel deaktivieren = true, Schlüsselwert unterbrechen) => {
  let Regelliste = [
    ...(disableDefaultRule ? defaultPasswordRuleList : []),
    ...benutzerdefinierteRegel,
  ].map((item) => ({ ...item, [passwordBreakKey]: false }));
  const range = Math.max(...ruleList.map((ruleItem) => ruleItem.list.length));
  lass matchCount = 0;
  Regelliste = setArrayMatch<Zeichenfolge, IpasswordRule>({
    Array: Eingabewert.split(''),
    Reichweite,
    Übereinstimmungsliste: Regelliste,
    // keine vollständige Übereinstimmung mit breakKey
    breakKey: breakKey === void 0 ? passwordBreakKey : breakKey,
    tokenMap: (Regelelement, Eingabetoken, Suchindex) => {
      const match = Regelelement?.list[Suchindex] === Eingabetoken;
      wenn (Übereinstimmung) {
        Übereinstimmungsanzahl++;
        return { ...ruleItem, isMatch: true };
      }
      Regelelement zurückgeben;
    },
  });
  zurückkehren {
    Liste: Regelliste,
    Karte: neue Karte (Regelliste.Karte ((e) => [e.Name, e[PasswortBreakKey]])),
    Übereinstimmungsanzahl,
    // Um ​​diesen Wert zu erhalten, muss breakkey auf einen Null-String gesetzt werden. Wenn Sie vorzeitig beenden, wird der Zustand vorzeitig beendet. // Um ​​diesen Wert zu erhalten, muss breakkey auf einen Null-String gesetzt werden
    ungültiges Wort: matchCount !== Eingabewert.Länge,
  };
};

exportiere const isMatchForceResultConfig = (
  Konfiguration: matchResultConfig,
  matchNum: Zahl,
  inputValueLen: Zahl,
) => {
  zurückkehren (
    Übereinstimmungsnummer === Konfiguration.Übereinstimmungsnummer &&
    Eingabewertlänge >= config.min &&
    Eingabewertlänge <= config.max &&
    (config.need !== undefiniert ? config.need : true)
  );
};

Exporttyp matchResultConfig = {
  min: Zahl;
  max: Zahl;
  Übereinstimmungsnummer: Nummer;
  Wert: IpasswordForce;
  brauchen?: Boolesch;
  zurück?: IpasswordForce;
};
Exporttyp IpasswordForce = false | „hoch“ | „mittel“ | „niedrig“;

Der Vorgang besteht darin, Regeln zusammenzuführen. Eine davon ist die Standardregel und die andere die benutzerdefinierte Regel. Wenn Sie die Regel anpassen, wird die Standardregel überschrieben.
Suchen Sie unter den Regeln diejenige mit der größten Anzahl an Regeln, da wir beim späteren Durchlaufen alle Regeln zusammenführen können. Unabhängig davon, wie viele Regeln es gibt, macht die Anzahl der Durchläufe keinen großen Unterschied.

Die Traversierungsfunktion ist eine separate Funktion höherer Ordnung, mit der die interne Logik angepasst werden kann. Zu diesem Zeitpunkt stimmen wir mit der entsprechenden Regel überein, aktivieren die Eigenschaften der entsprechenden Regel und sammeln die übereinstimmenden Zeichen.

Wenn alle Übereinstimmungen erreicht sind, sollte die Durchquerung beendet werden. Es gibt jedoch eine Situation, in der die Durchquerung nicht beendet werden kann, und zwar dann, wenn ermittelt werden muss, ob ungültige Zeichen vorhanden sind.

Schließlich wirft diese Funktion die verarbeiteten Daten an die übergeordnete Komponente weiter. Dies ist der Prozess.

Beim Datenwerfen können einige Szenarien eine spezielle Verarbeitung der Daten entsprechend den Regeln erfordern, aber wenn es sich um eine Array-Struktur handelt, ist dies sehr unpraktisch. Daher sollten die geworfenen Daten in Listen- und Kartentypen unterteilt werden. Wenn die Anwendung auf höherer Ebene die entsprechenden Regeln abrufen möchte, kann sie map.get (Regelname) ausführen.

Konstanten.ts

export const specialList = ["~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "=", "-", "/", ",", ".", "?", "<", ">", ";", ":", "[", "]", "{", "}", "|", "\\"];
export const numberList = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'];
export const wordList = ["q", "a", "z", "w", "s", "x", "e", "d", "c", "r", "f", "v", "t", "g", "b", "y", "h", "n", "u", "j", "m", "i", "k", "o", "l", "p", "Q", "A", "Z", "W", "S", "X", "E", "D", "C", "R", "F", "V", "T", "G", "B", "Y", "H", "N", "U", "J", "M", "I", "K", "O", "L", "P"];

andere

Viele Leute fragen sich vielleicht, ob ein Code-Detektor so kompliziert sein muss. Wäre es nicht besser, einfach reguläre Ausdrücke zu verwenden? Aus praktischer Sicht sind reguläre Ausdrücke eigentlich praktischer, aber manchmal möchten wir uns nicht an die Regeln halten oder den Nervenkitzel des manuellen Codierens oder wir möchten aus langweiligem Code mehr Spielbarkeit herausholen usw. Also schreiben wir einen Code, der ziemlich kompliziert aussieht, aber die darunterliegende Schicht kapselt, dann flexibel bleibt und die Geschäftsschicht so einfach wie möglich hält. Tatsächlich ist es nicht unmöglich, es auszuprobieren, aber es wird bei der Überprüfung auch kritisiert. Bitte seien Sie beim Kopieren vorsichtig. Wenn Sie wenig Zeit haben oder nicht über gute Codierkenntnisse verfügen, wird die Verwendung dieses Codes nicht empfohlen. Ich übernehme keine Verantwortung für etwaige Probleme.

Zusammenfassen

Dies ist das Ende dieses Artikels über die Implementierung eines Passwortstärkedetektors in React. Weitere relevante Inhalte zum Passwortstärkedetektor von React finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

<<:  Installationsschritte von Docker-CE auf dem Raspberry Pi 4b Ubuntu19-Server

>>:  Zusammenfassung der in MySQL häufig verwendeten Typkonvertierungsfunktionen (empfohlen)

Artikel empfehlen

Natives JavaScript zum Erzielen von Folieneffekten

Wenn wir eine Seite erstellen, insbesondere eine ...

CSS3 verwendet var()- und calc()-Funktionen, um Animationseffekte zu erzielen

Wissenspunkte in der Vorschau anzeigen. Animation...

So ändern Sie den Benutzer und die Gruppe einer Datei in Linux

Wenn unter Linux eine Datei erstellt wird, ist de...

Details zur Destrukturierungszuweisung in Javascript

Inhaltsverzeichnis 1. Array-Dekonstruktion 2. Obj...

Die perfekte Lösung zum Hervorheben von Schlüsselwörtern in HTML

Bei der Arbeit an einem Projekt bin ich kürzlich ...

Detaillierte Erklärung der Socket (TCP)-Bindung aus dem Linux-Quellcode

Inhaltsverzeichnis 1. Ein einfachstes serverseiti...

Uniapp realisiert gleitenden Scoring-Effekt

In diesem Artikel wird der spezifische Code von U...

JavaScript-Grundlagenreihe: Funktionen und Methoden

Inhaltsverzeichnis 1. Der Unterschied zwischen Fu...

MySQL-Operationen: Operationen mit JSON-Datentyp

Im vorherigen Artikel haben wir das ausführliche ...