ホームページ  >  記事  >  バックエンド開発  >  Djangoのユーザー認証システム(2) Webリクエストにおける認証

Djangoのユーザー認証システム(2) Webリクエストにおける認証

黄舟
黄舟オリジナル
2016-12-23 17:42:121482ブラウズ

現在のユーザーを表すすべての Web リクエストに request.user 属性を指定します。現在のユーザーがログインしていない場合、この属性は AnonymousUser のインスタンスになり、それ以外の場合は User インスタンスになります。

is_authenticated() で区別できます。例:

if request.user.is_authenticated():
# 認証されたユーザーに対して何かを行います。
else:
# 匿名のユーザーに対して何かを行います。

ログイン

login()

ログイン関数にはパラメータとして HttPRequest オブジェクトと User オブジェクトが必要です。 login() は、Django のセッション フレームワークを使用して、ユーザーの ID をセッションに保存します。

authenticate()とlogin()を同時に使用します:

from django.contrib.auth importauthenticate,login

def my_view(request):
username = request.POST['username']
passWord = request .POST[ 'password']
user =authenticate(username=username, password=password) if user is not None:
if user.is_active:
login(request, user)
# 成功ページにリダイレクトします。
el se :
# 「無効なアカウント」エラー メッセージを返します
else:
# 「無効なログイン」エラー メッセージを返します。

ログアウト logout

logout()

HttpRequest オブジェクトをパラメーターとして使用し、戻り値はありません。例:

from django.contrib.auth import logout


def logout_view(request):
logout(request)
# 成功ページにリダイレクトします。

アクセスを制限します

生の方法

request.userを使用します. is_authenticated()

リダイレクト:

django.shortcuts からリダイレクトをインポート


def my_view(request):
request.user.is_authenticated():
return redirect('/login/?next=%s' % 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=REDIRECT_FIELD_NAME,login_url=None]

from django.contrib.auth.decorators import login_required


@login_required ed
def my_view ( request):
...

ユーザーがログインしていない場合は、settings.LOGIN_URL にリダイレクトし、現在の URL の相対パスを使用してキーとして次のクエリ文字ペアを形成し、settings.LOGIN_URL に追加します。 :

/ accounts/login/?next=/polls/3/.


クエリ文字ペアのキーはデフォルトで next ですが、自分で名前を付けることもできます:

from django.contrib.auth.decorators import login_required


@login_required(redirect_field_name=' my_redirect_field')
def my_view(request):
...

login_url を自分で定義することもできます:

from django.contrib.auth.decorators import login_required


@login_required(login_url ='/accounts/login/')
def my_view(request):
...

urls.py を定義する必要があります:

(r'^accounts/login/$', 'django.contrib.auth .views.login'),


ログインしているユーザーをテストします

たとえば、ユーザーの電子メールを検出するには:

def my_view(request):

request.user.email:
に '@example.com' がない場合return HttpResponse("この投票では投票できません。")
# ...

デコレータを使用できます:

from django.contrib.auth.decorators import user_passes_test


def email_check(user):
return user.email の「@example.com」

@user_passes_test(email_check)
def my_view(request):
...

login_url を変更することもできます:

@user_passes_test(email_check, login_url='/login) /')

def my_view(request):
...

認証ビュー

もちろん、ログイン、ログアウト、パスワード管理のためのビュー関数を自分で定義することもでき、その方が便利です。

ただし、Django の組み込みビューについて学ぶこともできます。

Django は認証ビューのデフォルトのテンプレートを提供しませんが、以下の各ビューのテンプレート コンテキストが文書化されています。

すべての組み込みビューは TemplateResponse インスタンスを返すため、応答データを簡単にカスタマイズできます。

https://github.com/django/django/blob/master/django/contrib/auth/views.py

組み込み認証ビューのほとんどは、使用する URL 名を提供します。

login(request[、template_name、redirect_field_name、authentication_form、current_app、extra_context])

ソースコード:

def login(request, template_name='registration/login.html',
redirect_field_name=REDIRECT_FIELD_NAME,
authentication_form=AuthenticationForm,
current_app=None, extra_context=None):
"" "
ログイン フォームを表示し、ログイン アクションを処理します.
"""
redirect_to = request.POST.get(redirect_field_name,
request.GET.get(redirect_field_name, ''))

if request.method == "POST":
form = 認証フォーム(リクエスト, データ= request.POST)
if form.is_valid():

# ユーザー発信のリダイレクト URL が安全であることを確認します
そうでない場合 is_safe_url(url=redirect_to, host=request.get_host()):
redirect_to =solve_url(設定. LOGIN_REDIRECT_URL)

# さて、セキュリティチェックは完了しました。ユーザーをログインします。
auth_login(request, form.get_user())

return HttpResponseRedirect(redirect_to)
else:
form =authentication_form(request)

get_current_site = (リクエスト)

context = {
'フォーム' : form,
redirect_field_name: redirect_to,
'site': current_site,
'site_name': current_site.name,
}
extra_context が None でない場合:
context.update(extra_context)
return TemplateResponse(request, template_name, context,
current_app=current_app)

URL 名:login

パラメータ:

template_name: 默认の登陆模板.默认はregistration/login.html.
redirect_field_name:重定方向の名前、次へ承認します。
authentication_form: 默认フォーム。デフォルトは AuthenticationForm です。
current_app: 現在のビューがどのアプリケーションに含まれているかを示すヒント。詳細については、名前空間 URL 解決戦略を参照してください。
extra_context: 承認コンテキスト データ内の追加データを文字典に追加します。

django.contrib.auth.views.login は次のようにします。 、そのコンテンツを同じ URL に POST することができます。POST 経由でアクセスすると、まず登録が試行され、成功した場合は次に指定された接続に戻ります。次の設定が行われていない場合は、settings.LOGIN_REDIRECT_URL に戻ります。 (通常、accounts/profile/ が保存されます)。 ログインが失敗した場合は、再度ログイン用のテンプレートが表示されます。上下文量:

form: 1 つの表オブジェクトAuthenticationForm.
next: 登録成功後の逆方向接続。クエリ文字列を含めることができます。

site: 現在のウェブサイト、SITE_ID に基づいて設定されます。サイト フレームがインストールされていない場合、この量RequestSite の例として設定され、現在の HttpRequest からサイト ポイント名とドメイン名が取得されます。

registration/login.html モジュールの使用を望まない場合は、URLconf で特定の view パラメータを設定して、template_name パラメータを渡すことができます。 auth.views.login', {'template_name': 'myapp/login.html'})、



また、redirect_field_name パラメータを介して、再定方向接続フィールド名を独自に指定することもできます。 registration/login.html モジュールの初期状態では、base.html モジュール (コンテンツ ブロックが含まれる) が定義されています。

{% extends "base.html" %}

{% block content %}

{% if form.errors %}

ユーザー名とパスワードが一致しませんでした。もう一度お試しください。
{% endif %}


{% csrf_token %}

{{ form.username.label_tag }}
{{ form.username }}

< ;tr>
{{ form.password.label_tag }}
{{ form.password }}





{% endblock %}

認証システムをカスタマイズする場合は、authentication_form パラメーターを介して、カスタマイズされた認証フォームをログイン ビューに渡すことができます。フォームの __init__ メソッドにはリクエスト パラメーターがあり、認証された User オブジェクトを返す get_user メソッドを提供する必要があります。

logout(request[, next_page, template_name, redirect_field_name, current_app,extra_context])

ユーザーをログアウトします。

URL名: logout

オプションのパラメータ:

next_page: ログアウト後のリダイレクトリンク。

logout_then_login (request [、login_url、current_app、extra_context])

ユーザーをログアウトし、ログイン リンクにリダイレクトします。

オプションのパラメーター:

login_url: ログイン ページへのリダイレクト リンク。デフォルト値は settings.LOGIN_URL です。

password_change(request[, template_name, post_change_redirect,password_change_form,current_app, extra_context])

ユーザーがパスワードを変更できるようにします。

URL名:password_change

オプションの引数:

template_name:テンプレート名、デフォルト値はregistration/password_change_formです.html 。
post_change_redirect: リダイレクトリンク。
password_change_form: ユーザーパラメータを含む、カスタマイズされたパスワード変更フォーム。デフォルト値はPasswordChangeFormです。

password_change_done(request[, template_name,current_app, extra_context])

ユーザーがパスワードを変更した後のページ。

URL名:password_change_done

オプションの引数オプションの引数:

template_name:テンプレート名, デフォルトは、registration/password_change_done.html です。

password_reset(request[, is_admin_site, template_name, email_template_name,password_reset_form, token_generator, post_reset_redirect, from_email, current_app, extra_context, html_email_template_name])

パスワードを含む電子メールをユーザーに送信します-time link 、ユーザーがパスワードをリセットできるようにします。

入力されたメールアドレスが存在しない場合、メールは送信されません。

URL名:password_reset

オプションの引数オプションの引数:

template_name:テンプレート名、デフォルト値はregistration/password_reset_form.htmlです。
email_template_name: リチャージ リンクを含むメールの生成に使用されるテンプレート名。デフォルト値は、registration/password_reset_email.html です。
subject_template_name: 電子メールの件名の生成に使用されるテンプレートの名前。デフォルト値は、registration/password_reset_subject.txt です。
password_reset_form: パスワード リセット フォーム、デフォルト値は PasswordResetForm です。

token_generator: ワンタイム リンクのクラス インスタンスを確認します。デフォルト値は、default_token_generator、そのクラスは django.contrib.auth.tokens.PasswordResetTokenGenerator.

post_reset_redirect:パスワードのリセット後のリダイレクト リンク。

from_email: 電子メール アドレス。デフォルト値は DEFAULT_FROM_EMAIL です。

current_app: 現在のビューが含まれているアプリケーションを示すヒント。詳細については、名前空間 URL 解決戦略を参照してください。
extra_context: の辞書。テンプレートに渡されるデフォルトのコンテキスト データに追加されるコンテキスト データ。
html_email_template_name: パスワード リセット リンクを含むテキスト/HTML マルチパート電子メールの生成に使用するテンプレートの完全な名前。デフォルトでは、HTML 電子メールは送信されません。

例:Registration/password_reset_email.html (メール コンテンツ テンプレート):

誰かがメール {{ email }} のパスワードのリセットを要求しました。以下のリンクに従ってください:
{{ プロトコル}}://{{ ドメイン }}{ % url 'password_reset_confirm' uidb64=uid token=token %}

password_reset_done(request[, template_name])

ユーザーがパスワード リセット電子メールの送信を選択した後にページを表示します。 post_reset_redirect リンクがpassword_reset() ビューで明示的に指定されていない場合、このビューは直接呼び出されます。

password_reset_confirm(request[, uidb36, token, template_name, token_generator,set_password_form, post_reset_redirect,current_app, extra_context])

新しいパスワードを入力するためのフォームを表示します

password_reset_complete(request[, template_name, current_app, extra_context])

Heavy パスワードの設定に成功した後のフォーム。

ヘルパー関数

redirect_to_login(next[, login_url, redirect_field_name])

ログインに成功したら、別のリンクにリダイレクトします。 .

パラメータ:

next: ログイン成功後のリンク

login_url: ログインページのリンク、デフォルト値: settings.LOGIN_URL。

redirect_field_name: リダイレクトフィールド名、デフォルト値は次です。

組み込みフォーム

クラス AdminPasswordChangeForm

管理者バックグラウンドユーザーパスワード変更フォーム

クラス AuthenticationForm

ログインフォーム。

メソッドconfirm_login_allowed(user)

たとえば、 is_active 属性に関係なく、すべてのユーザーにログインを許可します。 、 user): ただ PASS またはアクティブなユーザーのみのログインを許可します:

Class PickyauthenticationForm (AuthenticationForm):
DEF confirm_login_allowed (SELF, User):
IF not user.is_active:
rais e Forms.validationerror (
_ ("このアカウントは非アクティブです。」)、
through use through using through out through out through out through out through out through out ' ' ' through ‐ ‐ ‐ off , _(" 申し訳ありませんが、「b」で始まるアカウントはここでは歓迎されません。"),

code='no_b_users',

class PasswordChangeForm

class PasswordResetForm

class SetPass wordForm

パスワード設定フォーム

class UserChangeForm

管理者の権限変更フォーム

クラス UserCreationForm

ユーザー作成フォーム。

テンプレートの認証情報 テンプレートの認証データ

現在ログインしているユーザーとその権限は、

Users

をレンダリングするときにテンプレート変数で取得できます。テンプレート RequestContext、現在ログインしているユーザー (User インスタンスまたは AnonymousUser インスタンスのいずれであっても) は、テンプレート変数 {{ user }}:

{% if user.is_authenticated %}

ようこそ。 { { user.username }} ログインしていただきありがとうございます。

{% else %}

ようこそ、新しいユーザーです

RequestContext が使用されていない場合、この変数は存在しません。 St Use RequestContext:

from django.shortcuts import render_To_Response

from django.template Import REQUESTCONTEXTEF SOMEF SOME_View (リクエスト):

# ... Return Render_to_Response ('My_template.html',

my_data_dictionary,

context_instance = requestContextExt (request))

上記は、Django ユーザー認証システム (2) Web リクエストの認証内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。