Django認証システムの使用
このドキュメントでは、デフォルト構成でのDjangoの認証システムの使用法について説明します。 この構成は、最も一般的なプロジェクトのニーズに対応するように進化し、かなり広範囲のタスクを処理し、パスワードとアクセス許可を注意深く実装しています。 認証の必要性がデフォルトと異なるプロジェクトの場合、Djangoは認証の広範な拡張とカスタマイズをサポートします。
Django認証は、認証と承認の両方を一緒に提供し、これらの機能がいくらか結合されているため、一般に認証システムと呼ばれます。
Userオブジェクト
User オブジェクトは認証システムの中核です。 これらは通常、サイトを操作する人々を表し、アクセスの制限、ユーザープロファイルの登録、コンテンツの作成者への関連付けなどを可能にするために使用されます。 Djangoの認証フレームワークに存在するユーザーのクラスは1つだけです。つまり、 ' superusers ' またはadmin ' staff ' ユーザーは、特別な属性が設定された単なるユーザーオブジェクトです。 、異なるクラスのユーザーオブジェクトではありません。
デフォルトユーザーの主な属性は次のとおりです。
完全なリファレンスについては、完全なAPIドキュメントを参照してください。以下のドキュメントは、よりタスク指向です。
ユーザーの作成
ユーザーを作成する最も直接的な方法は、付属の create_user()ヘルパー関数を使用することです。
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', '[email protected]', 'johnpassword')
# At this point, user is a User object that has already been saved
# to the database. You can continue to change its attributes
# if you want to change other fields.
>>> user.last_name = 'Lennon'
>>> user.save()
Django管理者がインストールされている場合は、ユーザーをインタラクティブに作成することもできます。
スーパーユーザーの作成
:djadmin: `createsuperuser` コマンドを使用してスーパーユーザーを作成します。
$ python manage.py createsuperuser --username=joe [email protected]
パスワードの入力を求められます。 入力すると、すぐにユーザーが作成されます。 --username
または--email
オプションを省略した場合、それらの値の入力を求めるプロンプトが表示されます。
パスワードの変更
Djangoは、生の(クリアテキスト)パスワードをユーザーモデルに保存せず、ハッシュのみを保存します(詳細については、パスワードの管理方法に関するドキュメントを参照してください)。 このため、ユーザーのパスワード属性を直接操作しようとしないでください。 これが、ユーザーを作成するときにヘルパー関数が使用される理由です。
ユーザーのパスワードを変更するには、いくつかのオプションがあります。
:djadmin: `manage.py changepassword *ユーザー名* ` コマンドラインからユーザーのパスワードを変更する方法を提供します。 特定のユーザーのパスワードを変更するように求められますが、これは2回入力する必要があります。 両方が一致する場合、新しいパスワードはすぐに変更されます。 ユーザーを指定しない場合、コマンドは、ユーザー名が現在のシステムユーザーと一致するパスワードを変更しようとします。
set_password()を使用して、プログラムでパスワードを変更することもできます。
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
Django管理者がインストールされている場合は、認証システムの管理ページでユーザーのパスワードを変更することもできます。
Djangoは、ユーザーが自分のパスワードを変更できるようにするために使用できるビューおよびフォームも提供します。
ユーザーのパスワードを変更すると、すべてのセッションがログアウトされます。 詳しくは、パスワード変更時のセッション無効化をご覧ください。
ユーザーの認証
- authenticate(request=None, **credentials)
authenticate()を使用して、一連の資格情報を確認します。 クレデンシャルをキーワード引数として受け取り、デフォルトの場合は
username
とpassword
で、各認証バックエンドと照合し、 User オブジェクトを返します。クレデンシャルはバックエンドに対して有効です。 クレデンシャルがどのバックエンドに対しても有効でない場合、またはバックエンドが PermissionDenied を発生させた場合、None
を返します。 例えば:from django.contrib.auth import authenticate user = authenticate(username='john', password='secret') if user is not None: # A backend authenticated the credentials else: # No backend authenticated the credentials
request
は、認証バックエンドのauthenticate()
メソッドで渡されるオプションの HttpRequest です。ノート
これは、一連の資格情報を認証するための低レベルの方法です。 たとえば、 RemoteUserMiddleware によって使用されます。 独自の認証システムを作成していない限り、おそらくこれを使用することはありません。 むしろ、ユーザーにログインする方法を探している場合は、 LoginView を使用してください。
Webリクエストでの認証
Djangoは、セッションとミドルウェアを使用して、認証システムをリクエストオブジェクトにフックします。
これらは、現在のユーザーを表すすべてのリクエストに request.user 属性を提供します。 現在のユーザーがログインしていない場合、この属性は AnonymousUser のインスタンスに設定されます。それ以外の場合は、 User のインスタンスになります。
次のように、 is_authenticated でそれらを区別できます。
if request.user.is_authenticated:
# Do something for authenticated users.
...
else:
# Do something for anonymous users.
...
ユーザーをログインさせる方法
現在のセッションに接続する認証済みユーザーがいる場合、これは login()関数を使用して実行されます。
- login(request, user, backend=None)
ビューからユーザーにログインするには、 login()を使用します。 HttpRequest オブジェクトと User オブジェクトを取ります。 login()は、Djangoのセッションフレームワークを使用して、ユーザーのIDをセッションに保存します。
匿名セッション中のデータセットは、ユーザーがログインした後もセッションに保持されることに注意してください。
この例は、 authenticate()と login()の両方を使用する方法を示しています。
from django.contrib.auth import authenticate, login def my_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) # Redirect to a success page. ... else: # Return an 'invalid login' error message. ...
認証バックエンドの選択
ユーザーがログインすると、ユーザーのIDと認証に使用されたバックエンドがユーザーのセッションに保存されます。 これにより、同じ認証バックエンドが将来のリクエストでユーザーの詳細を取得できるようになります。 セッションに保存する認証バックエンドは、次のように選択されます。
- オプションの
backend
引数が指定されている場合は、その値を使用します。 user.backend
属性の値が存在する場合は、それを使用します。 これにより、 authenticate()と login()のペアリングが可能になります。 authenticate()は、返すユーザーオブジェクトにuser.backend
属性を設定します。- :setting: `AUTHENTICATION_BACKENDS` が1つしかない場合は、
backend
を使用します。 - それ以外の場合は、例外を発生させます。
ケース1と2の場合、backend
引数またはuser.backend
属性の値は、点線のインポートパス文字列である必要があります(:setting: `AUTHENTICATION_BACKENDS` にあるようなもの)。 )、実際のバックエンドクラスではありません。
ユーザーをログアウトする方法
- logout(request)
django.contrib.auth.login()を介してログインしたユーザーをログアウトするには、ビュー内で django.contrib.auth.logout()を使用します。 HttpRequest オブジェクトを受け取り、戻り値はありません。 例:
from django.contrib.auth import logout def logout_view(request): logout(request) # Redirect to a success page.
logout()は、ユーザーがログインしていない場合でもエラーをスローしないことに注意してください。
logout()を呼び出すと、現在のリクエストのセッションデータが完全に消去されます。 既存のデータはすべて削除されます。 これは、他の人が同じWebブラウザーを使用してログインし、前のユーザーのセッションデータにアクセスできないようにするためです。 ログアウト直後にユーザーが利用できるものをセッションに入れたい場合は、 django.contrib.auth.logout()を呼び出して後にを実行します。
ログインしたユーザーへのアクセスを制限する
生の方法
ページへのアクセスを制限する生の方法は、 request.user.is_authenticated を確認し、ログインページにリダイレクトすることです。
from django.conf import settings
from django.shortcuts import redirect
def my_view(request):
if not request.user.is_authenticated:
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
# ...
…またはエラーメッセージを表示します:
from django.shortcuts import render
def my_view(request):
if not request.user.is_authenticated:
return render(request, 'myapp/login_error.html')
# ...
login_requiredデコレータ
- login_required(redirect_field_name='next', login_url=None)
ショートカットとして、便利な login_required()デコレータを使用できます。
from django.contrib.auth.decorators import login_required @login_required def my_view(request): ...
login_required()は次のことを行います。
ユーザーがログインしていない場合は、にリダイレクトします :setting: `settings.LOGIN_URL ` 、クエリ文字列で現在の絶対パスを渡します。 例:
/accounts/login/?next=/polls/3/
。ユーザーがログインしている場合は、通常どおりビューを実行します。 ビューコードは、ユーザーがログインしていることを前提としています。
デフォルトでは、認証が成功したときにユーザーがリダイレクトされるパスは、
"next"
というクエリ文字列パラメーターに格納されます。 このパラメーターに別の名前を使用する場合は、 login_required()はオプションのredirect_field_name
パラメーターを取ります。from django.contrib.auth.decorators import login_required @login_required(redirect_field_name='my_redirect_field') def my_view(request): ...
redirect_field_name
に値を指定する場合、リダイレクトパスを格納するテンプレートコンテキスト変数はredirect_field_name
の値を次のように使用するため、ログインテンプレートもカスタマイズする必要がある可能性が高いことに注意してください。"next"
(デフォルト)ではなく、そのキー。login_required()も、オプションの
login_url
パラメーターを取ります。 例:from django.contrib.auth.decorators import login_required @login_required(login_url='/accounts/login/') def my_view(request): ...
指定しない場合は注意してください
login_url
パラメータ、あなたは次のことを確認する必要があります :setting: `settings.LOGIN_URL ` ログインビューは適切に関連付けられています。 たとえば、デフォルトを使用して、URLconfに次の行を追加します。from django.contrib.auth import views as auth_views path('accounts/login/', auth_views.LoginView.as_view()),
NS :setting: `settings.LOGIN_URL ` ビュー関数名も受け入れ、 名前付きURLパターン 。 これにより、設定を更新しなくても、URLconf内でログインビューを自由に再マップできます。
ノート
login_required
デコレータは、ユーザーのis_active
フラグをチェックしませんが、デフォルトの:setting: `AUTHENTICATION_BACKENDS` は非アクティブなユーザーを拒否します。
も参照してください
Djangoの管理者用にカスタムビューを作成している場合(または組み込みビューが使用するのと同じ認証チェックが必要な場合)、 django.contrib.admin.views.decorators.staff_member_required()デコレータaが見つかる場合があります。 login_required()
の便利な代替手段。
LoginRequiredミックスイン
クラスベースビューを使用する場合、LoginRequiredMixin
を使用すると、login_required
と同じ動作を実現できます。 このミックスインは、継承リストの左端にある必要があります。
- class LoginRequiredMixin
ビューがこのミックスインを使用している場合、 raise_exception パラメーターに応じて、認証されていないユーザーによるすべてのリクエストがログインページにリダイレクトされるか、HTTP 403Forbiddenエラーが表示されます。
AccessMixin の任意のパラメーターを設定して、許可されていないユーザーの処理をカスタマイズできます。
from django.contrib.auth.mixins import LoginRequiredMixin class MyView(LoginRequiredMixin, View): login_url = '/login/' redirect_field_name = 'redirect_to'
ノート
login_required
デコレータと同様に、このミックスインはユーザーのis_active
フラグをチェックしませんが、デフォルトの:setting: `AUTHENTICATION_BACKENDS` は非アクティブなユーザーを拒否します。
テストに合格したログインユーザーへのアクセスを制限する
特定のアクセス許可またはその他のテストに基づいてアクセスを制限するには、前のセクションで説明したのと基本的に同じことを行います。
ビューの request.user で直接テストを実行できます。 たとえば、このビューは、ユーザーが目的のドメインに電子メールを持っていることを確認し、持っていない場合は、ログインページにリダイレクトします。
from django.shortcuts import redirect
def my_view(request):
if not request.user.email.endswith('@example.com'):
return redirect('/login/?next=%s' % request.path)
# ...
- user_passes_test(test_func, login_url=None, redirect_field_name='next')
ショートカットとして、呼び出し可能オブジェクトが
False
を返すときにリダイレクトを実行する便利なuser_passes_test
デコレータを使用できます。from django.contrib.auth.decorators import user_passes_test def email_check(user): return user.email.endswith('@example.com') @user_passes_test(email_check) def my_view(request): ...
user_passes_test()は、必須の引数を取ります。 User オブジェクトを受け取り、ユーザーがページの表示を許可されている場合は
True
を返す呼び出し可能オブジェクトです。 user_passes_test()は、 User が匿名でないことを自動的にチェックしないことに注意してください。user_passes_test()は、2つのオプションの引数を取ります。
login_url
テストに合格しなかったユーザーがリダイレクトされるURLを指定できます。 ログインページである可能性があり、デフォルトは :setting: `settings.LOGIN_URL ` 指定しない場合。
redirect_field_name
login_required()の場合と同じです。
None
に設定すると、URLから削除されます。これは、テストに合格しなかったユーザーを「次のページ」がない非ログインページにリダイレクトする場合に実行することをお勧めします。
例えば:
@user_passes_test(email_check, login_url='/login/') def my_view(request): ...
- class UserPassesTestMixin
クラスベースのビューを使用する場合、
UserPassesTestMixin
を使用してこれを行うことができます。- test_func()
実行されるテストを提供するには、クラスの
test_func()
メソッドをオーバーライドする必要があります。 さらに、 AccessMixin の任意のパラメーターを設定して、許可されていないユーザーの処理をカスタマイズできます。from django.contrib.auth.mixins import UserPassesTestMixin class MyView(UserPassesTestMixin, View): def test_func(self): return self.request.user.email.endswith('@example.com')
- get_test_func()
get_test_func()
メソッドをオーバーライドして、ミックスインがチェックに( test_func()の代わりに)別の名前の関数を使用するようにすることもできます。
スタッキング
UserPassesTestMixin
UserPassesTestMixin
の実装方法により、継承リストにスタックすることはできません。 以下は機能しません。class TestMixin1(UserPassesTestMixin): def test_func(self): return self.request.user.email.endswith('@example.com') class TestMixin2(UserPassesTestMixin): def test_func(self): return self.request.user.username.startswith('django') class MyView(TestMixin1, TestMixin2, View): ...
TestMixin1
がsuper()
を呼び出し、その結果を考慮に入れると、TestMixin1
はスタンドアロンでは機能しなくなります。
permission_requiredデコレータ
- permission_required(perm, login_url=None, raise_exception=False)
ユーザーが特定の権限を持っているかどうかを確認することは、比較的一般的なタスクです。 そのため、Djangoはその場合のショートカットを提供します: permit_required()デコレータ。:
from django.contrib.auth.decorators import permission_required @permission_required('polls.add_choice') def my_view(request): ...
has_perm()メソッドと同様に、権限名は
"<app label>.<permission codename>"
(つまり、polls.add_choice
は、polls
アプリケーションのモデルに対する許可を求めます)。デコレータは反復可能な権限を取得する場合もあります。その場合、ユーザーはビューにアクセスするためにすべての権限を持っている必要があります。
permit_required()もオプションの
login_url
パラメーターを受け取ることに注意してください。from django.contrib.auth.decorators import permission_required @permission_required('polls.add_choice', login_url='/loginpage/') def my_view(request): ...
のようにログインが必要です() デコレータ、
login_url
デフォルトは :setting: `settings.LOGIN_URL ` 。raise_exception
パラメーターが指定されている場合、デコレーターは PermissionDenied を発生させ、ログインページにリダイレクトする代わりに、 403(HTTP Forbidden)ビューを要求します。raise_exception
を使用するだけでなく、ユーザーに最初にログインする機会を与える場合は、 login_required()デコレータを追加できます。from django.contrib.auth.decorators import login_required, permission_required @login_required @permission_required('polls.add_choice', raise_exception=True) def my_view(request): ...
これにより、 LoginView の
redirect_authenticated_user=True
で、ログインしたユーザーが必要なすべての権限を持っていない場合のリダイレクトループも回避されます。
PermissionRequiredMixinミックスイン
クラスベースのビューに権限チェックを適用するには、PermissionRequiredMixin
を使用できます。
- class PermissionRequiredMixin
このミックスインは、
permission_required
デコレータと同様に、ビューにアクセスするユーザーにすべての権限が付与されているかどうかを確認します。permission_required
パラメーターを使用して、アクセス許可(またはアクセス許可の反復可能)を指定する必要があります。from django.contrib.auth.mixins import PermissionRequiredMixin class MyView(PermissionRequiredMixin, View): permission_required = 'polls.add_choice' # Or multiple of permissions: permission_required = ('polls.view_choice', 'polls.change_choice')
AccessMixin の任意のパラメーターを設定して、許可されていないユーザーの処理をカスタマイズできます。
これらのメソッドをオーバーライドすることもできます。
- get_permission_required()
ミックスインで使用されるイテラブルのパーミッション名を返します。 デフォルトは
permission_required
属性で、必要に応じてタプルに変換されます。
- has_permission()
現在のユーザーが装飾されたビューを実行する権限を持っているかどうかを示すブール値を返します。 デフォルトでは、これは、 get_permission_required()によって返されるアクセス許可のリストを使用して has_perms()を呼び出した結果を返します。
認証ビュー
Djangoは、ログイン、ログアウト、およびパスワード管理の処理に使用できるいくつかのビューを提供します。 これらはストック認証フォームを利用しますが、独自のフォームを渡すこともできます。
Djangoは、認証ビューのデフォルトテンプレートを提供していません。 使用するビュー用に独自のテンプレートを作成する必要があります。 テンプレートコンテキストは各ビューに文書化されています。すべての認証ビューを参照してください。
ビューの使用
これらのビューをプロジェクトに実装するには、さまざまな方法があります。 最も簡単な方法は、提供されたURLconfをdjango.contrib.auth.urls
の独自のURLconfに含めることです。次に例を示します。
urlpatterns = [
path('accounts/', include('django.contrib.auth.urls')),
]
これには、次のURLパターンが含まれます。
accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
ビューは、参照しやすいようにURL名を提供します。 名前付きURLパターンの使用の詳細については、 URLドキュメントを参照してください。
URLをより細かく制御したい場合は、URLconfで特定のビューを参照できます。
from django.contrib.auth import views as auth_views
urlpatterns = [
path('change-password/', auth_views.PasswordChangeView.as_view()),
]
ビューには、ビューの動作を変更するために使用できるオプションの引数があります。 たとえば、ビューが使用するテンプレート名を変更する場合は、template_name
引数を指定できます。 これを行う方法は、URLconfにキーワード引数を指定することです。これらはビューに渡されます。 例えば:
urlpatterns = [
path(
'change-password/',
auth_views.PasswordChangeView.as_view(template_name='change-password.html'),
),
]
すべてのビューはクラスベースであり、サブクラス化することで簡単にカスタマイズできます。
すべての認証ビュー
これは、django.contrib.auth
が提供するすべてのビューのリストです。 実装の詳細については、ビューの使用を参照してください。
- class LoginView
URL名:
login
名前付きURLパターンの使用の詳細については、 URLドキュメントを参照してください。
属性:
template_name
:ユーザーのログインに使用されるビューに表示するテンプレートの名前。 デフォルトはregistration/login.html
です。redirect_field_name
:ログイン後にリダイレクトするURLを含むGET
フィールドの名前。 デフォルトはnext
です。authentication_form
:認証に使用する呼び出し可能オブジェクト(通常はフォームクラス)。 デフォルトは AuthenticationForm です。extra_context
:テンプレートに渡されるデフォルトのコンテキストデータに追加されるコンテキストデータの辞書。redirect_authenticated_user
:ログインページにアクセスする認証済みユーザーが、ログインに成功したかのようにリダイレクトされるかどうかを制御するブール値。 デフォルトはFalse
です。警告
redirect_authenticated_user
を有効にすると、他のWebサイトは、Webサイト上の画像ファイルへのリダイレクトURLを要求することにより、訪問者がサイトで認証されているかどうかを判断できます。 この「ソーシャルメディアフィンガープリント」情報の漏洩を回避するには、すべての画像とファビコンを別のドメインでホストします。redirect_authenticated_user
を有効にすると、raise_exception
パラメーターが使用されていない限り、 permit_required()デコレーターを使用するときにリダイレクトループが発生する可能性もあります。success_url_allowed_hosts
: request.get_host()に加えて、ログイン後にリダイレクトしても安全なホストのset
。 デフォルトは空のset
です。
LoginView
の機能は次のとおりです。GET
を介して呼び出された場合、同じURLにPOSTするログインフォームが表示されます。 これについてはもう少し詳しく説明します。POST
を介してユーザーが送信した資格情報を使用して呼び出された場合、ユーザーはにログインしようとします。 ログインに成功すると、ビューはnext
で指定されたURLにリダイレクトされます。 もしもnext
提供されていない場合は、にリダイレクトされます :setting: `settings.LOGIN_REDIRECT_URL ` (デフォルトは/accounts/profile/
)。 ログインに失敗すると、ログインフォームが再表示されます。
デフォルトで
registration/login.html
と呼ばれるログインテンプレートのhtmlを提供するのはあなたの責任です。 このテンプレートには、次の4つのテンプレートコンテキスト変数が渡されます。form
: AuthenticationForm を表す Form オブジェクト。next
:ログインに成功した後にリダイレクトするURL。 これにはクエリ文字列も含まれる場合があります。site
::setting: `SITE_ID` 設定に従った、現在の Site 。 サイトフレームワークがインストールされていない場合、これは RequestSite のインスタンスに設定されます。これは、現在の HttpRequest からサイト名とドメインを取得します。site_name
:site.name
のエイリアス。 サイトフレームワークがインストールされていない場合、これは request.META [' SERVER_NAME '] の値に設定されます。 サイトの詳細については、「サイト」フレームワークを参照してください。
テンプレート
registration/login.html
を呼び出さない場合は、URLconfのas_view
メソッドに追加の引数を介してtemplate_name
パラメーターを渡すことができます。 たとえば、このURLconf行は代わりにmyapp/login.html
を使用します。path('accounts/login/', auth_views.LoginView.as_view(template_name='myapp/login.html')),
redirect_field_name
を使用して、ログイン後にリダイレクトするURLを含むGET
フィールドの名前を指定することもできます。 デフォルトでは、フィールドはnext
と呼ばれます。これは、開始点として使用できるサンプル
registration/login.html
テンプレートです。content
ブロックを定義するbase.html
テンプレートがあることを前提としています。{% extends "base.html" %} {% block content %} {% if form.errors %} <p>Your username and password didn't match. Please try again.</p> {% endif %} {% if next %} {% if user.is_authenticated %} <p>Your account doesn't have access to this page. To proceed, please login with an account that has access.</p> {% else %} <p>Please login to see this page.</p> {% endif %} {% endif %} <form method="post" action="{% url 'login' %}"> {% csrf_token %} <table> <tr> <td>{{ form.username.label_tag }}</td> <td>{{ form.username }}</td> </tr> <tr> <td>{{ form.password.label_tag }}</td> <td>{{ form.password }}</td> </tr> </table> <input type="submit" value="login"> <input type="hidden" name="next" value="{{ next }}"> </form> {# Assumes you setup the password_reset view in your URLconf #} <p><a href="{% url 'password_reset' %}">Lost password?</a></p> {% endblock %}
認証をカスタマイズしている場合(認証のカスタマイズを参照)、
authentication_form
属性を設定することでカスタム認証フォームを使用できます。 このフォームは、__init__()
メソッドでrequest
キーワード引数を受け入れ、認証されたユーザーオブジェクトを返すget_user()
メソッドを提供する必要があります(このメソッドは、フォームの検証が成功した後にのみ呼び出されます) 。
- class LogoutView
ユーザーをログアウトします。
URL名:
logout
属性:
next_page
:ログアウト後にリダイレクトするURL。 デフォルトは :setting: `settings.LOGOUT_REDIRECT_URL ` 。template_name
:ユーザーのログアウト後に表示するテンプレートのフルネーム。 デフォルトはregistration/logged_out.html
です。redirect_field_name
:ログアウト後にリダイレクトするURLを含むGET
フィールドの名前。 デフォルトはnext
です。 指定されたGET
パラメーターが渡された場合、next_page
URLをオーバーライドします。extra_context
:テンプレートに渡されるデフォルトのコンテキストデータに追加されるコンテキストデータの辞書。success_url_allowed_hosts
: request.get_host()に加えて、ログアウト後にリダイレクトしても安全なホストのset
。 デフォルトは空のset
です。
テンプレートコンテキスト:
title
:ローカライズされた文字列「ログアウト」。site
::setting: `SITE_ID` 設定に従った、現在の Site 。 サイトフレームワークがインストールされていない場合、これは RequestSite のインスタンスに設定されます。これは、現在の HttpRequest からサイト名とドメインを取得します。site_name
:site.name
のエイリアス。 サイトフレームワークがインストールされていない場合、これは request.META [' SERVER_NAME '] の値に設定されます。 サイトの詳細については、「サイト」フレームワークを参照してください。
- logout_then_login(request, login_url=None)
ユーザーをログアウトしてから、ログインページにリダイレクトします。
URL名:デフォルトのURLは提供されていません
オプションの引数:
login_url
:リダイレクト先のログインページのURL。 デフォルトは :setting: `settings.LOGIN_URL ` 提供されていない場合。
- class PasswordChangeView
URL名:
password_change
ユーザーがパスワードを変更できるようにします。
属性:
template_name
:パスワード変更フォームの表示に使用するテンプレートのフルネーム。 指定しない場合、デフォルトはregistration/password_change_form.html
です。success_url
:パスワードの変更が成功した後にリダイレクトするURL。 デフォルトは'password_change_done'
です。form_class
:user
キーワード引数を受け入れる必要があるカスタムの「パスワード変更」フォーム。 フォームは、実際にユーザーのパスワードを変更する責任があります。 デフォルトは PasswordChangeForm です。extra_context
:テンプレートに渡されるデフォルトのコンテキストデータに追加されるコンテキストデータの辞書。
テンプレートコンテキスト:
form
:パスワード変更フォーム(上記のform_class
を参照)。
- class PasswordChangeDoneView
URL名:
password_change_done
ユーザーがパスワードを変更した後に表示されるページ。
属性:
template_name
:使用するテンプレートのフルネーム。 指定しない場合、デフォルトはregistration/password_change_done.html
です。extra_context
:テンプレートに渡されるデフォルトのコンテキストデータに追加されるコンテキストデータの辞書。
- class PasswordResetView
URL名:
password_reset
パスワードのリセットに使用できる1回限りのリンクを生成し、そのリンクをユーザーの登録済み電子メールアドレスに送信することにより、ユーザーがパスワードをリセットできるようにします。
指定された電子メールアドレスがシステムに存在しない場合、このビューは電子メールを送信しませんが、ユーザーはエラーメッセージも受信しません。 これにより、潜在的な攻撃者への情報漏えいを防ぎます。 この場合にエラーメッセージを表示する場合は、 PasswordResetForm をサブクラス化し、
form_class
属性を使用できます。ノート
電子メールの送信には余分な時間がかかるため、既存の電子メールアドレスのリセット要求の期間と存在しない電子メールアドレスのリセット要求の期間が異なるため、電子メールアドレスの列挙タイミング攻撃に対して脆弱になる可能性があることに注意してください。 オーバーヘッドを減らすために、非同期で電子メールを送信できるサードパーティのパッケージを使用できます。 django-mailer 。
使用できないパスワードでフラグが付けられたユーザー( set_unusable_password()を参照)は、LDAPなどの外部認証ソースを使用する場合の誤用を防ぐためにパスワードのリセットを要求することはできません。 アカウントの存在が明らかになるため、エラーメッセージは表示されませんが、メールも送信されないことに注意してください。
属性:
template_name
:パスワードリセットフォームの表示に使用するテンプレートのフルネーム。 指定しない場合、デフォルトはregistration/password_reset_form.html
です。form_class
:パスワードをリセットするためのユーザーの電子メールを取得するために使用されるフォーム。 デフォルトは PasswordResetForm です。email_template_name
:パスワードのリセットリンクを含む電子メールの生成に使用するテンプレートのフルネーム。 指定しない場合、デフォルトはregistration/password_reset_email.html
です。subject_template_name
:パスワードのリセットリンクを含む電子メールの件名に使用するテンプレートのフルネーム。 指定しない場合、デフォルトはregistration/password_reset_subject.txt
です。token_generator
:ワンタイムリンクをチェックするクラスのインスタンス。 これはデフォルトでdefault_token_generator
になり、django.contrib.auth.tokens.PasswordResetTokenGenerator
のインスタンスです。success_url
:パスワードリセットリクエストが成功した後にリダイレクトするURL。 デフォルトは'password_reset_done'
です。from_email
:有効なメールアドレス。 デフォルトでは、Djangoは:setting: `DEFAULT_FROM_EMAIL` を使用します。extra_context
:テンプレートに渡されるデフォルトのコンテキストデータに追加されるコンテキストデータの辞書。html_email_template_name
:パスワードリセットリンク付きの text / html マルチパート電子メールの生成に使用するテンプレートのフルネーム。 デフォルトでは、HTMLメールは送信されません。extra_email_context
:メールテンプレートで利用できるコンテキストデータの辞書。 以下にリストされているデフォルトのテンプレートコンテキスト値をオーバーライドするために使用できます。domain
。
テンプレートコンテキスト:
form
:ユーザーのパスワードをリセットするためのフォーム(上記のform_class
を参照)。
メールテンプレートのコンテキスト:
email
:user.email
のエイリアスuser
:email
フォームフィールドによる、現在のユーザー。 パスワードをリセットできるのはアクティブユーザーのみです(User.is_active is True
)。site_name
:site.name
のエイリアス。 サイトフレームワークがインストールされていない場合、これは request.META [' SERVER_NAME '] の値に設定されます。 サイトの詳細については、「サイト」フレームワークを参照してください。domain
:site.domain
のエイリアス。 サイトフレームワークがインストールされていない場合、これはrequest.get_host()
の値に設定されます。protocol
:httpまたはhttpsuid
:Base64でエンコードされたユーザーの主キー。token
:リセットリンクが有効であることを確認するためのトークン。
サンプル
registration/password_reset_email.html
(メール本文テンプレート):Someone asked for password reset for email {{ email }}. Follow the link below: {{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
同じテンプレートコンテキストがサブジェクトテンプレートに使用されます。 件名は1行のプレーンテキスト文字列である必要があります。
- class PasswordResetDoneView
URL名:
password_reset_done
ユーザーにパスワードをリセットするためのリンクが電子メールで送信された後に表示されるページ。 PasswordResetView に明示的な
success_url
URLが設定されていない場合、このビューはデフォルトで呼び出されます。ノート
指定された電子メールアドレスがシステムに存在しない場合、ユーザーが非アクティブであるか、使用できないパスワードを持っている場合でも、ユーザーはこのビューにリダイレクトされますが、電子メールは送信されません。
属性:
template_name
:使用するテンプレートのフルネーム。 指定しない場合、デフォルトはregistration/password_reset_done.html
です。extra_context
:テンプレートに渡されるデフォルトのコンテキストデータに追加されるコンテキストデータの辞書。
- class PasswordResetConfirmView
URL名:
password_reset_confirm
新しいパスワードを入力するためのフォームを表示します。
URLからのキーワード引数:
uidb64
:Base64でエンコードされたユーザーのID。token
:パスワードが有効であることを確認するためのトークン。
属性:
template_name
:パスワード確認ビューを表示するためのテンプレートのフルネーム。 デフォルト値はregistration/password_reset_confirm.html
です。token_generator
:パスワードをチェックするクラスのインスタンス。 これはデフォルトでdefault_token_generator
になり、django.contrib.auth.tokens.PasswordResetTokenGenerator
のインスタンスです。post_reset_login
:パスワードのリセットが成功した後、ユーザーを自動的に認証する必要があるかどうかを示すブール値。 デフォルトはFalse
です。post_reset_login_backend
:post_reset_login
がTrue
の場合に、ユーザーを認証するときに使用する認証バックエンドへの点線のパス。 複数の:setting: `AUTHENTICATION_BACKENDS` が構成されている場合にのみ必要です。 デフォルトはNone
です。form_class
:パスワードの設定に使用されるフォーム。 デフォルトは SetPasswordForm です。success_url
:パスワードのリセットが行われた後にリダイレクトするURL。 デフォルトは'password_reset_complete'
です。extra_context
:テンプレートに渡されるデフォルトのコンテキストデータに追加されるコンテキストデータの辞書。reset_url_token
:パスワードリセットURLのコンポーネントとして表示されるトークンパラメーター。 デフォルトは'set-password'
です。
テンプレートコンテキスト:
form
:新しいユーザーのパスワードを設定するためのフォーム(上記のform_class
を参照)。validlink
:ブール値。リンク(uidb64
とtoken
の組み合わせ)が有効または未使用の場合はTrue。
- class PasswordResetCompleteView
URL名:
password_reset_complete
パスワードが正常に変更されたことをユーザーに通知するビューを表示します。
属性:
template_name
:ビューを表示するためのテンプレートのフルネーム。 デフォルトはregistration/password_reset_complete.html
です。extra_context
:テンプレートに渡されるデフォルトのコンテキストデータに追加されるコンテキストデータの辞書。
ヘルパー関数
- redirect_to_login(next, login_url=None, redirect_field_name='next')
ログインページにリダイレクトし、ログインに成功すると別のURLに戻ります。
必須の引数:
next
:ログインに成功した後にリダイレクトするURL。
オプションの引数:
login_url
:リダイレクト先のログインページのURL。 デフォルトは :setting: `settings.LOGIN_URL ` 提供されていない場合。redirect_field_name
:ログアウト後にリダイレクトするURLを含むGET
フィールドの名前。 指定されたGET
パラメーターが渡された場合、next
をオーバーライドします。
ビルトインフォーム
組み込みのビューを使用したくないが、この機能のフォームを作成する必要がないという利便性が必要な場合、認証システムは django.contrib.auth.forms [にあるいくつかの組み込みのフォームを提供します。 X221X]:
ノート
組み込みの認証フォームは、使用しているユーザーモデルについて特定の前提条件を設定します。 カスタムユーザーモデルを使用している場合は、認証システム用に独自のフォームを定義する必要がある場合があります。 詳細については、カスタムユーザーモデルでの組み込み認証フォームの使用に関するドキュメントを参照してください。
- class AdminPasswordChangeForm
ユーザーのパスワードを変更するために管理インターフェースで使用されるフォーム。
user
を最初の位置引数として取ります。
- class AuthenticationForm
にユーザーをログインするためのフォーム。
request
を最初の位置引数として取り、サブクラスで使用するためにフォームインスタンスに格納されます。- confirm_login_allowed(user)
デフォルトでは、
AuthenticationForm
は、is_active
フラグがFalse
に設定されているユーザーを拒否します。 この動作をカスタムポリシーでオーバーライドして、ログインできるユーザーを決定できます。 これは、AuthenticationForm
をサブクラス化し、confirm_login_allowed()
メソッドをオーバーライドするカスタムフォームを使用して行います。 指定されたユーザーがログインできない場合、このメソッドは ValidationError を発生させる必要があります。たとえば、「アクティブ」ステータスに関係なく、すべてのユーザーがログインできるようにするには、次のようにします。
from django.contrib.auth.forms import AuthenticationForm class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm): def confirm_login_allowed(self, user): pass
(この場合、 AllowAllUsersModelBackend など、非アクティブなユーザーを許可する認証バックエンドも使用する必要があります。)
または、一部のアクティブユーザーのみにログインを許可するには:
class PickyAuthenticationForm(AuthenticationForm): def confirm_login_allowed(self, user): if not user.is_active: raise ValidationError( _("This account is inactive."), code='inactive', ) if user.username.startswith('b'): raise ValidationError( _("Sorry, accounts starting with 'b' aren't welcome here."), code='no_b_users', )
- class PasswordChangeForm
- ユーザーがパスワードを変更できるようにするためのフォーム。
- class PasswordResetForm
ユーザーのパスワードをリセットするための1回限りの使用リンクを生成して電子メールで送信するためのフォーム。
- send_mail(subject_template_name, email_template_name, context, from_email, to_email, html_email_template_name=None)
引数を使用して
EmailMultiAlternatives
を送信します。 電子メールがユーザーに送信される方法をカスタマイズするためにオーバーライドできます。- パラメーター
subject_template_name –サブジェクトのテンプレート。
email_template_name –メール本文のテンプレート。
context –
subject_template
、email_template
、およびhtml_email_template
に渡されるコンテキスト(None
でない場合)。from_email –送信者の電子メール。
to_email –リクエスターのEメール。
html_email_template_name –HTML本文のテンプレート。 デフォルトは
None
です。この場合、プレーンテキストの電子メールが送信されます。
デフォルトでは、
save()
は、context
に PasswordResetView が電子メールコンテキストに渡すのと同じ変数を設定します。
- class SetPasswordForm
- ユーザーが古いパスワードを入力せずにパスワードを変更できるフォーム。
- class UserChangeForm
- ユーザーの情報と権限を変更するために管理インターフェースで使用されるフォーム。
- class UserCreationForm
新しいユーザーを作成するための ModelForm 。
username
(ユーザーモデルから)、password1
、およびpassword2
の3つのフィールドがあります。password1
とpassword2
が一致することを確認し、 validate_password()を使用してパスワードを検証し、 set_password()を使用してユーザーのパスワードを設定します。
テンプレートの認証データ
RequestContext を使用すると、現在ログインしているユーザーとその権限がテンプレートコンテキストで利用できるようになります。
専門性
技術的には、これらの変数は、 RequestContext を使用し、'django.contrib.auth.context_processors.auth'
コンテキストプロセッサが有効になっている場合にのみ、テンプレートコンテキストで使用可能になります。 これは、デフォルトで生成された設定ファイルにあります。 詳細については、 RequestContextドキュメントを参照してください。
ユーザー
テンプレート RequestContext をレンダリングすると、現在ログインしているユーザー( User インスタンスまたは AnonymousUser インスタンス)がテンプレート変数 [に格納されます。 X192X]:
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
RequestContext
が使用されていない場合、このテンプレートコンテキスト変数は使用できません。
権限
現在ログインしているユーザーの権限は、テンプレート変数テンプレート:Perms
に保存されます。 これはdjango.contrib.auth.context_processors.PermWrapper
のインスタンスであり、テンプレートに適した権限のプロキシです。
テンプレート:Perms
の単一属性ルックアップをブール値として評価することは、 User.has_module_perms()のプロキシです。 たとえば、ログインしたユーザーがfoo
アプリで権限を持っているかどうかを確認するには次のようにします。
{% if perms.foo %}
2レベル属性ルックアップをブール値として評価することは、 User.has_perm()のプロキシです。 たとえば、ログインしたユーザーにfoo.add_vote
権限があるかどうかを確認するには次のようにします。
{% if perms.foo.add_vote %}
テンプレートの権限を確認するより完全な例を次に示します。
{% if perms.foo %}
<p>You have permission to do something in the foo app.</p>
{% if perms.foo.add_vote %}
<p>You can vote!</p>
{% endif %}
{% if perms.foo.add_driving %}
<p>You can drive!</p>
{% endif %}
{% else %}
<p>You don't have permission to do anything in the foo app.</p>
{% endif %}
{% if in %}
ステートメントで権限を検索することもできます。 例えば:
{% if 'foo' in perms %}
{% if 'foo.add_vote' in perms %}
<p>In lookup works, too.</p>
{% endif %}
{% endif %}
管理者でのユーザーの管理
django.contrib.admin
とdjango.contrib.auth
の両方がインストールされている場合、管理者はユーザー、グループ、および権限を表示および管理するための便利な方法を提供します。 ユーザーは、他のDjangoモデルと同じように作成および削除できます。 グループを作成し、ユーザーまたはグループに権限を割り当てることができます。 管理者内で行われたモデルに対するユーザー編集のログも保存され、表示されます。
ユーザーの作成
メインの管理者インデックスページの「認証」セクションに「ユーザー」へのリンクが表示されます。 「ユーザーの追加」管理ページは、ユーザーの残りのフィールドを編集する前にユーザー名とパスワードを選択する必要があるという点で、標準の管理ページとは異なります。
また、ユーザーアカウントでDjango管理サイトを使用してユーザーを作成できるようにする場合は、ユーザーの追加およびユーザーの変更(つまり、「ユーザーの追加」および「ユーザーの変更」権限)。 アカウントにユーザーを追加する権限はあるが変更はできない場合、そのアカウントはユーザーを追加できません。 どうして? ユーザーを追加する権限がある場合は、スーパーユーザーを作成する権限があり、スーパーユーザーは他のユーザーを変更できます。 そのため、Djangoでは、わずかなセキュリティ対策として、との変更権限を追加する必要があります。
ユーザーに権限の管理を許可する方法について慎重に検討してください。 スーパーユーザー以外のユーザーにユーザーを編集する機能を与えると、スーパーユーザーに自分自身を含むユーザーの権限を昇格させることができるため、最終的にはスーパーユーザーのステータスを与えることと同じになります。
パスワードの変更
ユーザーパスワードは管理者には表示されません(データベースにも保存されません)が、パスワードストレージの詳細は表示されます。 この情報の表示には、管理者がユーザーパスワードを変更できるパスワード変更フォームへのリンクが含まれています。