Home

Awesome

<p align="center"> <img alt="angular-material-extensions's logo" height="256px" width="256px" style="text-align: center;" src="https://cdn.jsdelivr.net/gh/angular-material-extensions/password-strength@master/assets/angular-material-extensions-logo.svg"> </p>

@angular-material-extensions/password-strength - Material password strength meter to indicate how secure is the provided password

npm version npm demo docs: typedoc Join the chat at https://gitter.im/angular-material-extensions/Lobby CircleCI branch Build Status codecov dependency Status devDependency Status Greenkeeper Badge license Awesome

<p align="center"> <img alt="@angular-material-extensions/password-strength demonstration" style="text-align: center;" src="https://raw.githubusercontent.com/angular-material-extensions/password-strength/HEAD/assets/v3.2.0/demo.gif"> </p>

Built by and for developers :heart:

Do you have any question or suggestion ? Please do not hesitate to contact us! Alternatively, provide a PR | open an appropriate issue here

If you like this project, support angular-material-extensions by starring :star: and sharing it :loudspeaker:

Table of Contents

<a name="demo"/>

Demo

View all the directives and components in action at https://angular-material-extensions.github.io/password-strength

<a name="components"/>

Library's components

  1. strength score <= 20%
<p align="center"> <img alt="@angular-material-extensions/password-strength score less than 20%" style="text-align: center;" src="https://raw.githubusercontent.com/angular-material-extensions/password-strength/HEAD/assets/v2.1.0/scrore_lesst_than_20.png"> </p>
  1. strength score <= 80%
<p align="center"> <img alt="@angular-material-extensions/password-strength score less than 40%" style="text-align: center;" src="https://raw.githubusercontent.com/angular-material-extensions/password-strength/HEAD/assets/v2.1.0/scrore_lesst_than_40.png"> </p>
  1. strength score > 80%
<p align="center"> <img alt="@angular-material-extensions/password-strength score less than 100%" style="text-align: center;" src="https://raw.githubusercontent.com/angular-material-extensions/password-strength/HEAD/assets/v2.1.0/scrore_lesst_than_100.png"> </p> <p align="center"> <img alt="@angular-material-extensions/password-strength's info" style="text-align: center;" src="https://raw.githubusercontent.com/angular-material-extensions/password-strength/HEAD/assets/v2.1.0/ngx-material-strength-password-info.png"> </p> <p align="center"> <img alt="@angular-material-extensions/password-strength's info" style="text-align: center;" src="https://raw.githubusercontent.com/angular-material-extensions/password-strength/HEAD/assets/v3.6.0/mat-pass-toggle-visibility.gif"> </p>
<a name="dependencies"/>

Dependencies


<a name="installation"/>

Installation

1. Install via ng add. (Recommended)

If Angular Material Design is not setup, just run ng add @angular/material learn more

Now add the library via the angular schematics

ng add @angular-material-extensions/password-strength

2. Install via npm. (Alternative)

Now install @angular-material-extensions/password-strength via:

npm install --save @angular-material-extensions/password-strength

SystemJS

Note:If you are using SystemJS, you should adjust your configuration to point to the UMD bundle. In your systemjs config file, map needs to tell the System loader where to look for @angular-material-extensions/password-strength:

{
  '@angular-material-extensions/password-strength';: 'node_modules/@angular-material-extensions/password-strength/bundles/password-strength.umd.js',
}

-> follow the instructions here


Import the library

Once installed you need to import the main module:

import { MatPasswordStrengthModule } from "@angular-material-extensions/password-strength";

The only remaining part is to list the imported module in your application module. The exact method will be slightly different for the root (top-level) module for which you should end up with the code similar to (notice MatPasswordStrengthModule .forRoot()):

import { MatPasswordStrengthModule } from '@angular-material-extensions/password-strength';

@NgModule({
  declarations: [AppComponent, ...],
  imports: [MatPasswordStrengthModule.forRoot(), ...],
  bootstrap: [AppComponent]
})
export class AppModule {
}

Other modules in your application can simply import MatPasswordStrengthModule:

import { MatPasswordStrengthModule } from '@angular-material-extensions/password-strength';

@NgModule({
  declarations: [OtherComponent, ...],
  imports: [MatPasswordStrengthModule, ...],
})
export class OtherModule {
}
<a name="api"/>

API

<mat-password-strength> used to calculate and display the strength of a provided password - see the demo examples

optionbindtypedefaultdescription
passwordInput() string-the password to calculate its strength
customValidatorInput() RegExp-custom regex validator
externalErrorInput() booleanfalseused to change the color of the password to warn if an external error occurs
enableLengthRuleInput() booleantruewhether to validate the length of the password
enableLowerCaseLetterRuleInput() booleantruewhether a lowercase letter is optional
enableUpperCaseLetterRuleInput() booleantruewhether a uppercase letter is optional
enableDigitRuleInput() booleantruewhether a digit char is optional
enableSpecialCharRuleInput() booleantruewhether a special char is optional
minInput() number8the minimum length of the password
maxInput() number30the maximum length of the password
warnThresholdInput() number21password strength less than this number shows the warn color
accentThresholdInput() number81password strength less than this number shows the accent color
onStrengthChangedOutput()number-emits the strength of the provided password in % e.g: 20%, 40%, 60%, 80% or 100%

<mat-password-strength-info> used to display more information about the strength of a provided password - see the demo examples

optionbindtypedefaultdescription
passwordComponentInput() PasswordStrengthComponent-the password component used in the template in order to display more info related to the provided password
enableScoreInfoInput() booleanfalsewhether to show the password's score in %
lowerCaseCriteriaMsgInput() stringcontains at least one lower characteran appropriate msg for the lower case %
upperCaseCriteriaMsgInput() stringcontains at least one upper characteran appropriate msg for the upper case %
digitsCriteriaMsgInput() stringcontains at least one digit characteran appropriate msg for the digit case %
specialCharsCriteriaMsgInput() stringcontains at least one special characteran appropriate msg for the special case %
customCharsCriteriaMsgInput() stringcontains at least one custom characteran appropriate msg for the custom validator case %
minCharsCriteriaMsgInput() stringcontains at least ${this.passwordComponent.min} charactersan appropriate msg for the minimum number of chars %

<mat-pass-toggle-visibility> used to show/hide the password provided in the input element

optionbindtypedefaultdescription
isVisibleInput() booleanfalsewhether the password is visible or hidden
tabindexInput() stringnullset the desired tabindex value of the toggle visibility button.

<a name="usage"/>

Usage

add the @angular-material-extensions/password-strength element to your template:

<mat-password-strength [password]="password.value"> </mat-password-strength>

This will display only the material password strength meter in form of a progress without any input fields or similar.

In the following example, we integration a material input container with @angular-material-extensions/password-strength 's component.

NOTE: In order to repaint the mat-form-field correctly after changing the value of the password's strength, please consider to change the detection strategy for the parent component -->

import {
  ChangeDetectionStrategy,
  Component,
  OnInit,
  ViewEncapsulation,
} from "@angular/core";
import { Title } from "@angular/platform-browser";
import { MatSlideToggleChange } from "@angular/material";
import { MatPasswordStrengthComponent } from "@angular-material-extensions/password-strength";

@Component({
  selector: "app-home",
  templateUrl: "./home.component.html",
  styleUrls: ["./home.component.scss"],
  encapsulation: ViewEncapsulation.None,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class HomeComponent implements OnInit {}
<div>
  <mat-form-field
    appearance="outline"
    style="width: 100%"
    [color]="passwordComponent.color"
  >
    <mat-label>Password</mat-label>
    <input
      matInput
      #password
      [type]="inputType"
      required
      placeholder="Password"
    />
    <mat-hint align="end" aria-live="polite">
      {{password.value.length}} / 25
    </mat-hint>
  </mat-form-field>

  <mat-password-strength
    #passwordComponent
    (onStrengthChanged)="onStrengthChanged($event)"
    [password]="password.value"
  >
  </mat-password-strength>
</div>

learn more about mat-form-field

Example of how to use the emitted strength of the password in your template

<div fxLayout="row" fxLayoutGap="10px">
  <div *ngIf="passwordComponent.strength === 100; then done else error"></div>
  <ng-template #done>
    <mat-icon color="primary">done</mat-icon>
  </ng-template>
  <ng-template #error>
    <mat-icon color="warn">error</mat-icon>
  </ng-template>
  <div>
    <p>Password's strength = {{passwordComponent.strength}} %100</p>
  </div>
</div>

Use the toggle visibility component

<mat-form-field
  appearance="outline"
  style="width: 100%"
  [color]="passwordComponent.color"
>
  <mat-label>Password</mat-label>
  <!-- HERE DOWN :D-->
  <mat-pass-toggle-visibility #toggle matSuffix></mat-pass-toggle-visibility>
  <!-- THERE ABOVE ;)-->
  <input
    matInput
    #password
    [type]="toggle.type"
    required
    placeholder="Password"
  />
  <mat-hint align="end" aria-live="polite">
    {{password.value.length}} / 25
  </mat-hint>
</mat-form-field>

Client Side password's validation using a built in angular formController

  1. add an input element to your template with an appropriate @angular-material-extensions/password-strength's component
  2. hold a reference of the @angular-material-extensions/password-strength's component by adding passwordComponentWithValidation (or whatever you want) inside the element

e.g:

<mat-password-strength
  #passwordComponentWithValidation
  [password]="passwordWithValidation.value"
>
</mat-password-strength>
  1. bind the form controller of the mat-password-strength to the input element
  1. Full example - see below
<div>
  <mat-form-field appearance="outline" style="width: 100%">
    <mat-label>Password</mat-label>
    <input
      matInput
      #passwordWithValidation
      [type]="inputType"
      required
      [formControl]="passwordComponentWithValidation.passwordFormControl"
      placeholder="Password"
    />
    <mat-hint align="end" aria-live="polite">
      {{passwordWithValidation.value.length}} / 25
    </mat-hint>
    <mat-error
      *ngIf="passwordComponentWithValidation.passwordFormControl.hasError('required')"
    >
      Password is required
    </mat-error>
    <mat-error
      *ngIf="passwordComponentWithValidation.passwordFormControl.hasError('pattern')"
    >
      Password is not valid
    </mat-error>
  </mat-form-field>
  <mat-password-strength
    #passwordComponentWithValidation
    (onStrengthChanged)="onStrengthChanged($event)"
    [password]="passwordWithValidation.value"
  >
  </mat-password-strength>
  <!--Password's strength info-->
  <mat-password-strength-info
    [passwordComponent]="passwordComponentWithValidation"
  >
  </mat-password-strength-info>
</div>

this will looks like -->

<p align="center"> <img alt="@angular-material-extensions/password-strength" style="text-align: center;" src="https://raw.githubusercontent.com/angular-material-extensions/password-strength/HEAD/assets/v2.1.0/demo_with_validation.gif"> </p>

custom regex validation

please consider to use the customValidator input (see below)

<mat-slide-toggle #toggle>Show Password Details</mat-slide-toggle>

<mat-form-field
  appearance="outline"
  style="width: 100%"
  [color]="passwordComponent.color"
>
  <mat-label>Password</mat-label>
  <mat-pass-toggle-visibility
    #toggleVisbility
    matSuffix
  ></mat-pass-toggle-visibility>
  <input
    matInput
    #password
    [type]="toggleVisbility.type"
    placeholder="Password"
  />
  <mat-hint align="end" aria-live="polite">
    {{password.value.length}} / {{passwordComponent.max}}
  </mat-hint>
</mat-form-field>

<mat-password-strength
  #passwordComponent
  (onStrengthChanged)="onStrengthChanged($event)"
  [password]="password.value"
  [customValidator]="pattern"
>
</mat-password-strength>

<mat-password-strength-info
  *ngIf="toggle.checked"
  [passwordComponent]="passwordComponent6"
  customCharsCriteriaMsg="1 german special chars is required"
  [enableScoreInfo]="true"
>
</mat-password-strength-info>
pattern = new RegExp(/^(?=.*?[äöüÄÖÜß])/);

Confirm the password with built in angular form controllers - see the live example

<p align="center"> <img alt="@angular-material-extensions/password-strength with confirmation feature" style="text-align: center;" src="https://raw.githubusercontent.com/angular-material-extensions/password-strength/HEAD/assets/v3.8.0/confirm01.png"> </p> <p align="center"> <img alt="@angular-material-extensions/password-strength with confirmation feature " style="text-align: center;" src="https://raw.githubusercontent.com/angular-material-extensions/password-strength/HEAD/assets/v3.8.0/confirm02.png"> </p>

Use always the green color for a strong password just by adding the green css class to the mat-password-strength

<mat-password-strength
  #passwordComponent
  class="green"
  [password]="password.value"
>
</mat-password-strength>

Supporting custom messages and ngx-translate for the info component please check the example demo here

<p align="center"> <img alt="@angular-material-extensions/password-strength demonstration" style="text-align: center;" src="https://raw.githubusercontent.com/angular-material-extensions/password-strength/HEAD/assets/v3.4.0/support_translations.png"> </p>

for more examples please visit this URL : [(https://angular-material-extensions.github.io/password-strength/examples]((https://angular-material-extensions.github.io/password-strength/examples)

Please checkout the full documentation here or follow the official tutorial


<a name="run-demo-app-locally"/>

Run Demo App Locally

<a name="development"/>

Development

Other Angular Libraries


<a name="support"/>

Support

Built by and for developers :heart: we will help you :punch:


Who is using this library? Awesome apps?

  1. Nahaus.de - Digitale und automatisierte Immobilienverwaltung Software für privat Vermieter und Hausverwaltungen

Are you missing your project or you app? PR me to publish it on the README



jetbrains logo

This project is supported by jetbrains with 1 ALL PRODUCTS PACK OS LICENSE incl. webstorm


<a name="license"/>

License

Copyright (c) 2019-2023 Anthony Nahas. Licensed under the MIT License (MIT)