This app provides tools to enforce stronger password policies and expiration.
- Configurable password expiration;
- Customizable password validator;
- Uses Django messages framework to warn the user about the expiration;
- Prevents user from logging in after expiration and redirects to password change page;
- Compatible with default Django admin and Django CMS (django-cms) admin;
- Can be used to expire only staff passwords, or for all users;
- Force password update immediately after user creation.
Requires Python >= 3.6 and Django >=2. Recommended Python 3.11 or 3.12 and Django 4.2 or 5.0;
- Install the lib with
pip install django-better-passwords
. - Add
'django_better_passwords.apps.BetterPasswordsConfig'
toINSTALLED_APPS
. - Add
'django_better_passwords.middleware.PasswordExpirationMiddleware'
toMIDDLEWARE
.
It should be listed after authentication, session and message middlewares, like this:MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django_better_passwords.middleware.PasswordExpirationMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", ]
- Add
'django_better_passwords.validators.custom_password_validator.CustomPasswordValidator'
toAUTH_PASSWORD_VALIDATORS
.
Comment out or remove'django.contrib.auth.password_validation.MinimumLengthValidator'
to avoid conflicting:AUTH_PASSWORD_VALIDATORS = [ ... # { # "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", # }, { "NAME": "django_better_passwords.validators.custom_password_validator.CustomPasswordValidator", "OPTIONS": { "min_length": 8, "max_length": 20, "required_characters": "!#$%^&*()_+{}[]:\"-=,./<>?", "required_characters_count": 2, "forbidden_characters": "@", }, }, ]
- The validator accepts 5 parameters, being:
min_length (int)
: the minimum password length;max_length (int)
: the maximum password length;required_characters (str)
: a string containing a list of special characters of which at leastrequired_characters_count
must be present in the password;required_characters_count (int)
: the number of special required characters that must be present in the password;forbidden_characters (str)
: a string containing a list of characters none of which can be present in the password;
- Aditional app settings:
Attention: If
DBP_PASSWORD_EXPIRATION_DAYS = 60 DBP_PASSWORD_CHANGE_REDIRECT_URL = "password_change" DBP_LOGOUT_URL = "logout"
DBP_PASSWORD_CHANGE_REDIRECT_URL
is present, when a user tries to log in or navigate to any url, he will be redirected to thepassword_change
page.
If it is not present, only users who try to access the admin area will be redirected.
We use pre-commit paired with black, flake8 and isort to keep things in their rightful place.
After cloning the project:
- Create and activate a venv;
- Install pip-tools;
- Run
pip-compile requirements.in
andpip-sync requirements.txt
to install dependencies; - Run
pre-commit install -f
to install pre-commit hook. It will create a git hook, that will run automatically before every commit;
This app is inspired by django-password-policies-iplweb and django-password-expire.
André Corrêa - [email protected]