Python | Django | ログインパスワードのバリデーション方法

2021年7月22日

公開日:2021/7/22

Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.

前記事にて,「ログインの実装方法」を記した.前記事での設定をそのまま引き継いだ上で,本記事では,「ログインパスワードのバリデーション方法」を以下2つの構成にて記す.

  1. 基本的なバリデーション方法
  2. 自作バリデーション方法

◆実施環境

Python 3.8.8
Django 3.2.3

■ログインパスワードのバリデーション方法

  1. 基本的なバリデーション方法

“user/views.py"に追記し,以下のように編集する.

from django.shortcuts import render, redirect
from django.http import HttpResponse
from user.forms import UserForm, ProfileForm, LoginForm
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.contrib.auth.password_validation import validate_password # 以下追記箇所(6~7行目)
from django.core.exceptions import ValidationError

def user_list(request):
  return render(request, 'user/user_list.html')

def index(request):
  return render(request, 'user/index.html')

def register(request): 
  user_form = UserForm(request.POST or None) 
  profile_form = ProfileForm(request.POST or None, request.FILES or None) 
  if user_form.is_valid() and profile_form.is_valid(): 
    user = user_form.save(commit=False) # 以下編集箇所(19~27行目)
    try:
      validate_password(user_form.cleaned_data.get('password'), user)
    except ValidationError as e:
      user_form.add_error('password', e)
      return render(request, 'user/registration.html', context={
        'user_form':user_form,
        'profile_form':profile_form,
      })
    user.set_password(user.password) 
    user.save() 
    profile = profile_form.save(commit=False) 
    profile.user = user
    profile.save() 
  return render(request, 'user/registration.html', context={ 
    'user_form':user_form, 
    'profile_form':profile_form,
  })

def user_login(request):
  login_form = LoginForm(request.POST or None)
  if login_form.is_valid():
    username = login_form.cleaned_data.get('username')
    password = login_form.cleaned_data.get('password')
    user = authenticate(username=username, password=password)
    if user:
      if user.is_active:
        login(request, user)
        return redirect('user:index')
      else:
        return HttpResponse('アカウントがアクティブでない')
    else:
      return HttpResponse('ユーザーが存在しません')
  return render(request, 'user/login.html', context={
    'login_form': login_form
  })

@login_required
def user_logout(request):
  logout(request)
  return redirect('user:index')

@login_required
def status(request):
  return HttpResponse('ログインしています')

ターミナルを開き,”conda activate 仮想環境名”を実行し,仮想環境に移行する(移行方法の詳細はこちら).その後,"cd viewproject"を実行することによって,”viewproject”のディレクトリに移動し,”python manage.py runserver”を実行する.

(djangoenv) C:\Users\shiro\Desktop\210517_python development\myviewtest\viewproject
>python manage.py runserver

System check identified no issues (0 silenced). # 以下出力箇所
July 22, 2021 - 15:09:44
Django version 3.2.3, using settings 'viewproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

上記ターミナルの"http://127.0.0.1:8000″をクリックすると,ブラウザにて以下ページが表示される.

ブラウザのURLにて,"http://127.0.0.1:8000/user/index"を入力すると,以下画面に遷移する.

“登録画面"をクリックすると,以下画面に遷移する.

各項目を入力し,パスワードがエラーになるように"0000″を入力し,"登録"をクリックする.以下のように3つの注意点が出現する.

1)パスワードは最低6文字以上にすること
2)パスワードは一般的過ぎです
3)パスワードは数字しか含まれていません

  1. 自作バリデーション方法

プロジェクト"viewproject"にフォルダ"utils"を作成し,その中に"validation.py"を作成する.

“viewproject/utils/validation.py"を以下のように編集する.

from django.core.exceptions import ValidationError
import re

class CustomPasswordValidator():
  msg = 'パスワードには,0-9, a-z, 記号(#$%&)を含めてください'

  def __init__(self):
    pass

  def validate(self,password,user=None):
    if all(
      (re.search('[0-9]', password), 
      re.search('[a-z]', password), 
      re.search('[#$%&]', password))):
      return
    raise ValidationError(self.msg)

  def get_help_text(self):
    return self.msg

“viewproject/settings.py"の"AUTH_PASSWORD_VALIDATORS"を以下のように編集する.

AUTH_PASSWORD_VALIDATORS = [
  {
    'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
  },
  {
    'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    'OPTIONS': {
      'min_length': 6,
    }
  },
  {
    'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
  },
  {
    'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
  },
  {
    'NAME': 'utils.validations.CustomPasswordValidator' # 追記箇所
  },
  ]

上記を保存し,"http://127.0.0.1:8000/user/index"に遷移し,"登録画面"をクリックする.以下画面にて,今回記述したエラーが発生するように"sevennine79″を入力し,"登録"をクリックする.以下のように注意点が出現する.

■参照

https://docs.djangoproject.com/ja/3.1/topics/auth/passwords/#writing-your-own-validator

以上