Heim  >  Artikel  >  Backend-Entwicklung  >  Django-Benutzerauthentifizierungssystem (2) Authentifizierung in Webanfragen

Django-Benutzerauthentifizierungssystem (2) Authentifizierung in Webanfragen

黄舟
黄舟Original
2016-12-23 17:42:121448Durchsuche

Geben Sie in jeder Webanfrage ein request.user-Attribut an, um den aktuellen Benutzer darzustellen. Wenn der aktuelle Benutzer nicht angemeldet ist, ist dieses Attribut eine Instanz von AnonymousUser, andernfalls eine User-Instanz.

Sie können es anhand von is_authenticated() unterscheiden, zum Beispiel:

if request.user.is_authenticated():
# Etwas für authentifizierte Benutzer tun.
else:
# Etwas für anonyme Benutzer tun.

Login login

login()

Die Login-Funktion erfordert ein HttPRequest-Objekt und ein User-Objekt als Parameter. login() verwendet das Sitzungsframework von Django, um die Benutzer-ID in der Sitzung zu speichern.

Authenticate() und login() gleichzeitig verwenden:

from django.contrib.auth import Authenticate, login

def my_view(request):
Benutzername = request .POST['username']
passWord = request.POST['password']
user = Authenticate(username=Benutzername, Passwort=Passwort)
wenn der Benutzer nicht None ist:
if user. is_active:
          login(request, user)
              # Eine Fehlermeldung „Ungültige Anmeldung“ zurückgeben.


Abmelden

logout()

Verwendet das HttpRequest-Objekt als Parameter und hat keinen Rückgabewert. Zum Beispiel:

from django.contrib.auth import logout

def logout_view(request):

logout(request)

# Weiterleitung zu einer Erfolgsseite.


Zugriff einschränken

Der einfache Weg

Verwenden Sie request.user.is_authenticated()

Umleitung:

von django.shortcuts Import Redirect

def my_view(request):

if not request.user.is_authenticated():

return restart('/login/?next=%s' % request.path)
# ...


oder:

from django.shortcuts import render

def my_view(request):

if not request.user.is_authenticated() :

return render(request, 'myapp/login_error.html')
# ...


Verwenden Sie den Dekorator login_required

login_required([redirect_field_name=REDIRECT_FIELD_NAME, login_url=Keine]

von django.contrib.auth.decorators import login_required

@login_required

def my_view(request):

...


Wenn der Benutzer nicht angemeldet ist, leiten Sie zu „settings.LOGIN_URL“ weiter und hängen Sie den relativen Pfad der aktuellen URL an, um als Schlüssel ein Abfragezeichenpaar zu bilden, und hängen Sie es an „settings.LOGIN_URL“ an:

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

Der Schlüssel des Abfragezeichenpaars ist standardmäßig next, Sie können ihn auch selbst benennen:


von django.contrib.auth .decorators import login_required

@login_required(redirect_field_name='my_redirect_field')

def my_view(request):

...


Sie können login_url auch selbst definieren:

von django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')

def my_view(request):

...


Erforderliche Definitionen in urls.py:

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

Anmeldung des Benutzers testen


Um beispielsweise die E-Mail-Adresse des Benutzers zu erkennen:

def my_view(request):

wenn nicht „@example.com“ in request.user .email:

return HttpResponse („Sie können in dieser Umfrage nicht abstimmen.“)

# ...



Sie können Dekoratoren verwenden:

von Django .contrib.auth.decorators import user_passes_test

def email_check(user):

return '@example.com' in user.email


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


Authentifizierungsansichten

Natürlich können wir einige Ansichtsfunktionen für die Anmeldung, Abmeldung und Passwortverwaltung selbst definieren, und das ist auch der Fall bequemer.

Aber Sie können auch mehr über die integrierten Ansichten von Django erfahren.

Django stellt keine Standardvorlage für Authentifizierungsansichten bereit, der Vorlagenkontext ist jedoch für jede Ansicht unten dokumentiert.

Alle integrierten Ansichten geben eine TemplateResponse-Instanz zurück, sodass Sie diese einfach anpassen können Antwortdaten.

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

Die meisten integrierten Authentifizierungsansichten bieten einen URL-Namen für verwenden.

Anmeldung(Anfrage[, Vorlagenname, Weiterleitungsfeldname, Authentifizierungsform,aktuelle_App,extra_Kontext])

Quellcode:

def login(request, template_name='registration/login.html',
         redirect_field_name=REDIRECT_FIELD_NAME,
         authentication_form=AuthenticationForm,
         current_app=None, extra_context=None):
   """
   Zeigt das Anmeldeformular an und verarbeitet die Anmeldeaktion.
   """
   redirect_to = request.POST.get(redirect_field_name,
                                  request.GET.get(redirect_field_name, ''))

   if request.method == "POST":
       form = Authentication_form(request, data=request.POST)
       if form.is_valid():

           # Stellen Sie sicher, dass der Benutzer stammt Weiterleitungs-URL ist sicher.
           falls nicht is_safe_url(url=redirect_to, host=request.get_host()):
             redirect_to =solve_url(settings.LOGIN_REDIRECT_URL)

           # Okay , Sicherheitskontrolle abgeschlossen. Melden Sie den Benutzer an.
           auth_login(request, form.get_user())

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

   aktuelle_Seite = get_current_site(request)

   context = {
       'form': form,
       redirect_field_name: restart_to,
       'site': current_site,
       'site_name': current_site.name,
   }
   wenn extra_context nicht None ist:
       context.update(extra_context)
   return TemplateResponse(request, template_name, context,
                         )

URL-Name: login

参数:

template_name: 默认的登陆模板.默认为registration/login.html.
redirect_field_name: 重定向的name,默认为next.
Authentication_form: Anmeldeformular. Der Standardwert ist AuthenticationForm.
current_app: Ein Hinweis, der angibt, welche Anwendung die aktuelle Ansicht enthält. Weitere Informationen finden Sie in der Namespace-URL-Auflösungsstrategie.
extra_context: 添加到默认context data中的额外数据,为字典。

django.contrib.auth.views.login tut:

如果通过GET访问, 将显示登录表单, 可以将其内容POST到相同的URL上.
如果通过POST访问,它首先会尝试登录, 如果成功, view就重定向到next指定的的链接.如果next 未设置,则重定向到settings.LOGIN_REDIRECT_URL(一般缺省值为accounts/profile/)。如果登录失败,则再次显示登录表单.

需要用户自己来提供login的html模板,缺省是registration/login.html Die Abfragezeichenfolge wird angezeigt中

site: 当前网站,根据 SITE_ID 设置。如果你并没有安装site框架,这个变量将设定为个. RequestSite实例,它从当前 HttpRequest中取得站点名和域名.

site_name: 是 site. name的一个别名.如果你没有安装site框架,它将会被设为 request.META['SERVER_NAME']的值。

如果你不想调用registration/login.html模板, 你可以在URLconf中设定特定的view参数来传递template_name参数.

(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login .html'}),

你也可以自己指定重定向链接字段名,通过redirect_field_name.默认的字段名为next.

下面是registration/login.html模板的原始状态,它假定你有一个base.html模板(其中有content block的定义。

{% erweitert "base.html" %}

{% Blockinhalt %}

{% if form.errors %}

Ihr Benutzername und Ihr Passwort stimmt nicht überein. Bitte versuchen Sie es erneut.


{% endif %}


{% csrf_token %}








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






{% endblock %}

Wenn Sie das Authentifizierungssystem anpassen, können Sie das benutzerdefinierte Authentifizierungsformular über den Parameter „authentication_form“ an die Anmeldeansicht übergeben. Die __init__-Methode des Formulars sollte einen Anforderungsparameter haben und eine get_user-Methode bereitstellen, um das authentifizierte Benutzerobjekt zurückzugeben.

logout(request[, nächste_Seite, Vorlagenname, Weiterleitungsfeldname, aktuelle_App,extra_context])

Benutzer abmelden.

URL-Name: Abmelden

Optionale Parameter :

next_page: Link nach dem Abmelden umleiten.

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

Benutzer abmelden und dann zum Anmeldelink weiterleiten.

Optionale Parameter:

login_url: Weiterleitungslink zur Anmeldeseite, der Standardwert ist Settings.LOGIN_URL.

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

Ermöglicht Benutzern das Ändern von Passwörtern.

URL-Name: password_change

Ja Optionale Argumente:

template_name: Vorlagenname, der Standardwert ist Registration/password_change_form.html.
post_change_redirect: Weiterleitungslink.
password_change_form: Benutzerdefiniertes Passwortänderungsformular, einschließlich eines Benutzerparameters. Der Standardwert ist PasswordChangeForm.

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

Die Seite, nachdem der Benutzer das Passwort geändert hat.

URL-Name: password_change_done

Optionale Argumente:

template_name: Vorlagenname, Standard ist 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])

Senden Sie eine E-Mail an den Benutzer, die einen einmaligen Link enthält, über den der Benutzer sein Passwort zurücksetzen kann.

Wenn die angegebene E-Mail-Adresse nicht existiert, wird sie nicht gesendet.

URL-Name: passwort_reset

Optionale Argumente Optionale Argumente:

template_name: Vorlagenname, der Standardwert ist Registration/password_reset_form.html.
email_template_name: Der Vorlagenname, der zum Generieren von E-Mails mit Aufladelinks verwendet wird. Der Standardwert ist Registration/password_reset_email.html.
subject_template_name: Der Name der Vorlage, die zum Generieren von E-Mail-Betreffern verwendet wird. Der Standardwert ist Registration/password_reset_subject.txt.
password_reset_form: Formular zum Zurücksetzen des Passworts, der Standardwert ist PasswordResetForm. PasswordResetTokenGenerator.

post_reset_redirect: Umleitungslink nach dem Zurücksetzen des Passworts.

from_email: E-Mail-Adresse, der Standardwert ist DEFAULT_FROM_EMAIL.


current_app: Ein Hinweis, der angibt, welche Anwendung enthält Weitere Informationen finden Sie in der Namespace-URL-Auflösungsstrategie.

extra_context: Ein Wörterbuch mit Kontextdaten, das zu den an die Vorlage übergebenen Standardkontextdaten hinzugefügt wird.

html_email_template_name: Der vollständige Name einer Vorlage an Zum Generieren einer mehrteiligen Text-/HTML-E-Mail mit dem Link zum Zurücksetzen des Passworts verwenden. Standardmäßig wird keine HTML-E-Mail gesendet.

Beispiel: Registration/password_reset_email.html (E-Mail-Inhaltsvorlage):

Jemand Bitte um Passwort-Zurücksetzung für E-Mail {{ email }}. Folgen Sie dem Link unten:

{{ Protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}



password_reset_done(request[, template_name])

Zeigt die Seite an, nachdem der Benutzer sich dafür entschieden hat, eine E-Mail zum Zurücksetzen des Passworts zu senden. Wenn der post_reset_redirect-Link nicht explizit in der Ansicht „password_reset()“ angegeben ist, wird diese Ansicht direkt aufgerufen.

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

Zeigt das Formular zur Eingabe des neuen Passworts an.

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

Das Formular nach einem erfolgreichen Passwort-Reset.

Hilfsfunktionen

redirect_to_login(next[, login_url, restart_field_name])

Weiterleitung zur Anmeldeseite. Nach erfolgreicher Anmeldung auf einen anderen Link umleiten. .

Parameter:

nächster: Link nach erfolgreicher Anmeldung.

login_url: Link zur Anmeldeseite, Standardwert: Settings.LOGIN_URL.

redirect_field_name: Name des Weiterleitungsfelds, der Standardwert ist next.

Eingebaute Formulare

Klasse AdminPasswordChangeForm

Formular zur Änderung des Passworts des Administrator-Hintergrundbenutzers

Klasse AuthenticationForm

Anmeldeformular.

Methode bestätigen_login_allowed(Benutzer)

Erlauben Sie beispielsweise allen Benutzern, sich anzumelden, unabhängig vom is_active-Attribut:

aus django.contrib.auth.forms import AuthenticationForm

class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm):
def activate_login_allowed(self, user):
pass

oder nur aktiven Benutzern die Anmeldung erlauben:

Klasse PickyAuthenticationForm(AuthenticationForm):
def activate_login_allowed(self, user):
if not user.is_active:
raise forms.ValidationError(
) _("Dieses Konto ist inaktiv."),
code='inactive' ,
          )
          if user.username.startswith('b'):
                                                                                     ' s                     bis         ‐ off   ‐ ‐ ‐ ‐ („Entschuldigung, Konten, die mit „b“ beginnen, sind nicht verfügbar "Hier nicht willkommen.")
🎜>Passwort-Reset-Formular.

Klasse SetPasswordForm

Passwort-Einstellungsformular.

Klasse UserChangeForm

Admin-Hintergrund Benutzerinformations- und Berechtigungsänderungsformular.

Klasse UserCreationForm

Benutzererstellungsformular.

Authentifizierungsinformationen in Vorlagen

Der aktuell angemeldete Benutzer und seine Berechtigungen können kann in den Vorlagenvariablen mithilfe von RequestContext abgerufen werden.

Benutzer

Beim Rendern der Vorlage RequestContext wird der aktuell angemeldete Benutzer, unabhängig davon, ob es sich um eine Benutzerinstanz oder eine AnonymousUser-Instanz handelt, in der Vorlage gespeichert Variable {{ user }}:

{% if user .is_authenticated %}

Willkommen, {{ user.username }} Vielen Dank für die Anmeldung.

{% else %}

Willkommen, neuer Benutzer. Bitte melden Sie sich an.

{% endif %}

Diese Variable existiert nicht, wenn RequestContext wird nicht verwendet.


RequestContext verwenden:

from django.shortcuts import render_to_response
from django.template import RequestContext

def some_view(request):
# ...
return render_to_response('my_template.html',

                                                                                                                                                                                                                                         )

 

Das Obige ist das Django-Benutzerauthentifizierungssystem (2) Authentifizierungsinhalt in Webanfragen Inhalt, achten Sie bitte auf die chinesische PHP-Website (www.php.cn)!




Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn