Python | Django | ログインパスワードのバリデーション方法
公開日:2021/7/22
Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.
前記事にて,「ログインの実装方法」を記した.前記事での設定をそのまま引き継いだ上で,本記事では,「ログインパスワードのバリデーション方法」を以下2つの構成にて記す.
◆実施環境
Python 3.8.8
Django 3.2.3
■ログインパスワードのバリデーション方法
“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)パスワードは数字しか含まれていません
プロジェクト"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
以上