Usando o sistema de autenticação Django¶
Este documento explica a utilização do sistema de autenticações do Django em suas configurações padrões. Estas configurações evoluíram para atender as necessidades mais comuns de um projeto, lidando com uma considerável quantidade de tarefas e implementando cuidadosamente, o uso de senhas e permissões. Para projetos onde o sistema de autenticações demande outras necessidades diferentes das padrões, o Django oferece suporte para uma extensiva customização: extension and customization de autenticação.
A autenticação do Django oferece, tanto autenticação como autorização juntos. Estes serviços são referenciados como “sistema de autenticação” uma vez estas funções são, de alguma forma, interligadas.
Objetos “User”¶
Os objetos do tipo User são o núcleo do sistema de autenticação. Eles tipicamente representam as pessoas interagindo com seu site e são usados para habilitar coisas como restrinção de acesso, registro de perfis de usuários, associar conteúdo com criadores etc. Somente uma classe de usuário existe no “framework” de autenticação do Django, isto é, usuários 'superusers' ou admin 'staff' são somente objetos do tipo “user” com atributos especiais definidos e não classes diferentes de objetos “user”.
Os atributos primários de usuário padrão são:
Veja a :class:` documentação completa da API <django.contrib.auth.models.User>` para maiores detalhes, a documentação em questão é mais orientada a tarefa.
Criando usuários¶
The most direct way to create users is to use the included
create_user() helper function:
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user("john", "lennon@thebeatles.com", "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()
Se você tiver a administração do Django instalado, você também pode: ref: ` criar usuários de forma interativa < auth -admin >` .
Criando superusuários¶
Create superusers using the createsuperuser command:
$ python manage.py createsuperuser --username=joe --email=joe@example.com
...\> py manage.py createsuperuser --username=joe --email=joe@example.com
Será solicitada então uma senha. Após inserí-la, a conta de usuário será criada imediatamente. Caso seja desligada a opção:--username ou --email, estes valores serão solicitados.
Mudando as senhas¶
O Django não armazena senha em sua forma bruta (texto limpo) no modelo do usuário, mas somente um “hash” (see documentação de como as senhas são manipuladas para detalhes completos). Por causa disso, não tente manipular diretamente o atributo “password” do usuário. Este é o porque de uma função auxiliar ser usada para criar um usuário.
Para mudar a senha de usuários, você tem várias opções:
manage.py changepassword *username* offers a method
of changing a user’s password from the command line. It prompts you to
change the password of a given user which you must enter twice. If
they both match, the new password will be changed immediately. If you
do not supply a user, the command will attempt to change the password
whose username matches the current system user.
You can also change a password programmatically, using
set_password():
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username="john")
>>> u.set_password("new password")
>>> u.save()
Se você tiver a administração do Django instalado, você também pode alterar a senha do usuário nas : ref: páginas de administração do ` sistema de autenticação < auth -admin >` .
Django também fornece : ref: ` views < built-in -auth- vistas >` e : ref: ` forms < built-in -auth-forms>` que podem ser utilizados para permitir que os usuários alterem suas próprias senhas.
Mudar a senha de um usuário irá “deslogar” todas as suas sessões. Para detalhes veja ref:session-invalidation-on-password-change.
Autenticando usuários¶
- authenticate(request=None, **credentials)[código-fonte]¶
- aauthenticate(request=None, **credentials)¶
Asynchronous version:
aauthenticate()Use
authenticate()to verify a set of credentials. It takes credentials as keyword arguments,usernameandpasswordfor the default case, checks them against each authentication backend, and returns aUserobject if the credentials are valid for a backend. If the credentials aren’t valid for any backend or if a backend raisesPermissionDenied, it returnsNone. For example: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 ...
requestis an optionalHttpRequestwhich is passed on theauthenticate()method of the authentication backends.Nota
This is a low level way to authenticate a set of credentials; for example, it’s used by the
RemoteUserMiddleware. Unless you are writing your own authentication system, you probably won’t use this. Rather if you’re looking for a way to login a user, use theLoginView.
Authentication in web requests¶
O Django usa sessions e o middleware para vincular o sistema de autenticação dentro dos objetos de requisição.
These provide a request.user attribute
and a request.auser async method
on every request which represents the current user. If the current user has not
logged in, this attribute will be set to an instance
of AnonymousUser, otherwise it will be an
instance of User.
Você pode distinguí-los com is_authenticated, como a seguir:
if request.user.is_authenticated:
# Do something for authenticated users.
...
else:
# Do something for anonymous users.
...
Or in an asynchronous view:
user = await request.auser()
if user.is_authenticated:
# Do something for authenticated users.
...
else:
# Do something for anonymous users.
...
Como autenticar um usuário¶
Caso queira adicionar um usuário autenticado à sessão atual - isto pode ser feito com a função login().
- login(request, user, backend=None)[código-fonte]¶
- alogin(request, user, backend=None)¶
Asynchronous version:
alogin()To log a user in, from a view, use
login(). It takes anHttpRequestobject and aUserobject.login()saves the user’s ID in the session, using Django’s session framework.Note que qualquer dado definido durante um sessão anônima, fica retido na sessão após um usuário logar.
This example shows how you might use both
authenticate()andlogin():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. ...
Selecionando o “backend” de autenticação¶
Quando um usuário se “loga” no sistema, o ID do usuário e o “backend” que foi usado para autenticação são salvos na sessão. Isso permite que o mesmo “backend” de autenticação seja usado para retornar detalhes do usuário em uma requisição futura. O “backend” de autenticação a ser salvo na sessão é selecionado da seguinte maneira:
Usa o valor do argumento
backendopcional, se fornecido.Use the value of the
user.backendattribute, if present. This allows pairingauthenticate()andlogin():authenticate()sets theuser.backendattribute on the user object it returns.Use o
backendnoAUTHENTICATION_BACKENDS, se houver somente um.Caso contrário, gera uma exceção.
Nos casos 1 e 2, o valor do argumento backend ou do atributo user.backend deve ser uma string com o caminho de importação na notação de pontos (como aquela encontrada em AUTHENTICATION_BACKENDS), e não a classe de “backend” atual.
Como finalizar a sessão de um usuário¶
- logout(request)[código-fonte]¶
- alogout(request)¶
Asynchronous version:
alogout()To log out a user who has been logged in via
django.contrib.auth.login(), usedjango.contrib.auth.logout()within your view. It takes anHttpRequestobject and has no return value. Example:from django.contrib.auth import logout def logout_view(request): logout(request) # Redirect to a success page.
Note that
logout()doesn’t throw any errors if the user wasn’t logged in.When you call
logout(), the session data for the current request is completely cleaned out. All existing data is removed. This is to prevent another person from using the same web browser to log in and have access to the previous user’s session data. If you want to put anything into the session that will be available to the user immediately after logging out, do that after callingdjango.contrib.auth.logout().
Limitando o acesso de usuários authenticados¶
A maneira padrão¶
The raw way to limit access to pages is to check
request.user.is_authenticated and either redirect to a
login page:
from django.conf import settings
from django.shortcuts import redirect
def my_view(request):
if not request.user.is_authenticated:
return redirect(f"{settings.LOGIN_URL}?next={request.path}")
# ...
… ou mostrar uma mensagem de erro:
from django.shortcuts import render
def my_view(request):
if not request.user.is_authenticated:
return render(request, "myapp/login_error.html")
# ...
O login_required decorator¶
- login_required(redirect_field_name='next', login_url=None)[código-fonte]¶
Como atalho, você pode usar o decorador conveniente
login_required()from django.contrib.auth.decorators import login_required @login_required def my_view(request): ...
A
login_required()faz o seguinte:Se o usuário não registrou seu acesso, redireciona para
settings.LOGIN_URL, passando caminho absoluto corrente na “querystring”. Example:/accounts/login/?next=/polls/3/.Se o usuário está autenticado, executa a “view” normalmente. O código da “view” é livre para assumir que o usuário está autenticado.
Por padrão, o caminho para o qual o usuário deve ser redirecionado após a autenticação está armazenado em um parâmetro na “query string” chamado
"next". Se preferir usar um outro nome para este parâmetro, alogin_required()recebe um parâmetro adicionalredirect_field_name:from django.contrib.auth.decorators import login_required @login_required(redirect_field_name="my_redirect_field") def my_view(request): ...
Repare que se você fornecer um valor para
redirect_field_name, você deverá também personalizar seus templates de login, já que a variável de contexto do template a qual armazena o caminho de redirecionamento irá usar o valor deredirect_field_namecomo sua chave ao invés de"next"(o padrão).A
login_required()também receve um parâmetro adicional chamadologin_url. Example:from django.contrib.auth.decorators import login_required @login_required(login_url="/accounts/login/") def my_view(request): ...
Repare que se você não especificar o parâmetro
login_url, terá que ter certeza que osettings.LOGIN_URLe sua “view” de login estão associados corretamente. Por exemplo, usando os padrões, adicione a seguinte linha ao seu URLconf:from django.contrib.auth import views as auth_views path("accounts/login/", auth_views.LoginView.as_view()),
A
settings.LOGIN_URLtambém aceita nome de funções “view”e named URL patterns. Isso permite a você mapear livremente sua “view” de login dentro do URconf sem ter que atualizar o arquivo de definições.
Nota
O decorador login_required não verifica o indicado is_active no usuário, mas a definição padrão de AUTHENTICATION_BACKENDS rejeita usuários inativos.
Ver também
Se estiver escrevendo “views” personalizadas para o admin do Django ( ou precisa da mesma verificação de autorização que as “views” embutidas usam), talvez ache a função decoradora django.contrib.admin.views.decorators.staff_member_required() uma alternativa útil para o login_required().
The LoginRequiredMixin mixin¶
Quando usar class-based views, você pode ter o mesmo comportamento que o login_required usando o LoginRequiredMixin. Este “mixin” deve estar na última posição mais a esquerda na lista de herança.
- class LoginRequiredMixin[código-fonte]¶
Se a “view” estiver usando o “mixin”, todos as requisições de usuário não autenticados serão redirecionadas para a página de login ou mostram um erro de falta de permissão HTTP 403, dependendo da definição do parâmetro
raise_exception.Você pode definir qualquer dos parâmetros da
AccessMixinpara personalizar a maneira como o sistema lida com usuários não autorizados:from django.contrib.auth.mixins import LoginRequiredMixin class MyView(LoginRequiredMixin, View): login_url = "/login/" redirect_field_name = "redirect_to"
Nota
Tal como o decorador login_required, este “mixin” não verifica o indicador is_active do usuário, mas o padrão dos AUTHENTICATION_BACKENDS é rejeitar usuário inativos.
The login_not_required decorator¶
When LoginRequiredMiddleware is
installed, all views require authentication by default. Some views, such as the
login view, may need to disable this behavior.
- login_not_required()[código-fonte]¶
Allows unauthenticated requests to this view when
LoginRequiredMiddlewareis installed.
Limitando o acesso de usuários autenticados que passam no teste.¶
Para limitar o acesso baseado em certas permissões ou outros testes, você deve fazer o mesmo que foi descrito na seção anterior.
You can run your test on request.user in
the view directly. For example, this view checks to make sure the user has an
email in the desired domain and if not, redirects to the login page:
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')[código-fonte]¶
Como atalho, você pode usar o conveniente decorador
user_passes_testo qual executa um redirecionamento quando a função passada retornaFalse: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): ...
A
user_passes_test()recebe um argumento obrigatório: um executável que recebe um objeto do tipoUsere retornaTruese é permitido ao usuário acessar a página. Note que auser_passes_test()não verifica automaticamente se oUsernão é anônimo.A
user_passes_test()pode receber dois argumentos opcionais:login_urlPermite que você especifique a URL para a qual os usuários que não passam no teste sejam redirecionados. Pode ser uma página de autenticação e seu padrão é o que estiver definido em
settings.LOGIN_URLse você não especificar nenhum.redirect_field_nameO mesmo que
login_required(). Se definido comoNoneele será removido da URL, o que você talvez queira que aconteça se você estiver redirecionando usuários que não passem no teste para uma página que não é a de autenticação e que não tenha o “next page”.
Por exemplo:
@user_passes_test(email_check, login_url="/login/") def my_view(request): ...
- class UserPassesTestMixin[código-fonte]¶
Quando usar as “views” baseadas em classes, você pode usar o
UserPassesTestMixinpara isso.- test_func()[código-fonte]¶
Você tem que sobrescrever o método
test_func()da classe para fornecer o teste a ser executado. Mais ainda, você pode definir qualquer dos parâmetros daAccessMixinpara personalizar a manipulação de usuários não autorizados: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()[código-fonte]¶
Você pode também sobrescrever o método
get_test_func()para que seja possível para o “mixin” usar um nome de função diferente para suas verificações (ao invés detest_func()).
Empilhando
UserPassesTestMixinDevido a maneira que o
UserPassesTestMixinfoi implementado, você não pode empilhá-las na sua lista de heranças. O que está descrito a seguir não funciona: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): ...
Se o
TestMixin1deve chamar osuper()e leva o resultado em conta, oTestMixin1não irá mais funcionar de maneira independente.
O permission_required decorator¶
- permission_required(perm, login_url=None, raise_exception=False)[código-fonte]¶
It’s a relatively common task to check whether a user has a particular permission. For that reason, Django provides a shortcut for that case: the
permission_required()decorator:from django.contrib.auth.decorators import permission_required @permission_required("polls.add_choice") def my_view(request): ...
Just like the
has_perm()method, permission names take the form"<app label>.<permission codename>"(i.e.polls.add_choicefor a permission on a model in thepollsapplication).O decorador pode também receber um iterável de permissões, e neste caso o usuário deve ter todas as permissões para acessar a “view”.
Note that
permission_required()also takes an optionallogin_urlparameter:from django.contrib.auth.decorators import permission_required @permission_required("polls.add_choice", login_url="/loginpage/") def my_view(request): ...
Assim como no decorador
login_required(), o padrão paralogin_urlé a definição desettings.LOGIN_URL.Se o parâmetro
raise_exceptioné fornecido, o decorador irá emitir umPermissionDenied, mostrando o the 403 (HTTP Forbidden) view ao invés de redirecionar para uma página de autenticação.Se quiser usar o
raise_exceptionmas também dar aos usuários a chance de se autenticar, você pode adicionar o decoradorlogin_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): ...
This also avoids a redirect loop when
LoginView’sredirect_authenticated_user=Trueand the logged-in user doesn’t have all of the required permissions.
O PermissionRequiredMixin mixin¶
Para aplicar verificações de permissões a “views” baseadas em classes, você pode usar o PermissionRequiredMixin:
- class PermissionRequiredMixin[código-fonte]¶
Este “mixin”, tal como o decorador
permission_required, verifica se o usuário que está acessando a “view” tem todas as permissões. Você deve especificar as permissões (ou um iterável de permissões) usando o parâmetropermission_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"]
Você pode definir qualquer um dos parâmetros da
AccessMixinpara personalizar o tratamento de usuários não autorizados.Você pode também sobrescrever estes métodos:
- get_permission_required()[código-fonte]¶
Retorna um iterável de nomes de permissões usados pelo “mixin”. O padrão é o que está definido no atributo
permission_required, convertido para uma tupla se necessário.
- has_permission()[código-fonte]¶
Returns a boolean denoting whether the current user has permission to execute the decorated view. By default, this returns the result of calling
has_perms()with the list of permissions returned byget_permission_required().
Views de autenticação¶
O Django disponibiliza várias views que você pode utilizar para lidar com login (autenticação), logout (saída), e alteração de senhas. Essas views fazem uso dos stock auth forms, porém, você pode passar/utilizar seus próprios forms (formulários), caso prefira.
O Django não disponibiliza um template padrão para as views de autenticação. Você deve criar seus próprios templates para as views que quiser uitlizar. O contexto do template está documentado em cada view. veja: Todas as views de autenticação.
Usando as views¶
Existem formas diferentes de implementar essas views em seu projeto. A mais fácil delas é: incluir a URLconf disponível em django.contrib.auth.urls dentro da sua própria URLconf. Por exemplo:
urlpatterns = [
path("accounts/", include("django.contrib.auth.urls")),
]
This will include the following URL patterns:
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']
As views disponibilizam um nome de URL, para serem referênciadas com mais facilidade. Veja the URL documentation para mais detalhes sobre como usar padrões de URL nomeados.
Caso queira ter mais controle sobre suas URLs, você pode referenciar uma view específica em seu URLconf:
from django.contrib.auth import views as auth_views
urlpatterns = [
path("change-password/", auth_views.PasswordChangeView.as_view()),
]
As views tem argumentos opcionais que podem ser utilizados para alterar o comportamento delas. Por exemplo, para mudar o nome do template de uma view, basta passar o argumento template_name. Uma maneira de fazer isso, é colocando **kwargs (argumentos de palvras chave) no seu URLconf. Estes argumentos serão passados para a view. Por exemplo:
urlpatterns = [
path(
"change-password/",
auth_views.PasswordChangeView.as_view(template_name="change-password.html"),
),
]
All views are class-based, which allows you to easily customize them by subclassing.
Todas as views de autenticação¶
Essa é uma lista com todas as views que django.contrib.auth disponibiliza. Para detalhes de implementação, veja Usando as views.
- class LoginView[código-fonte]¶
Nome da URL:
loginPara detalhes sobre como usar padrões de URLs nomeadas, veja: the URL documentation
Métodos e Atributos
- template_name¶
The name of a template to display for the view used to log the user in. Defaults to
registration/login.html.
- next_page¶
The URL to redirect to after login. Defaults to
LOGIN_REDIRECT_URL.
- redirect_field_name¶
The name of a
GETfield containing the URL to redirect to after login. Defaults tonext. Overrides theget_default_redirect_url()URL if the givenGETparameter is passed.
- authentication_form¶
A callable (typically a form class) to use for authentication. Defaults to
AuthenticationForm.
- extra_context¶
A dictionary of context data that will be added to the default context data passed to the template.
- redirect_authenticated_user¶
A boolean that controls whether or not authenticated users accessing the login page will be redirected as if they had just successfully logged in. Defaults to
False.Aviso
Se você habilitar o
redirect_authenticated_user, outros websites podem ser capazes de determinar se os visitantes estão autenticados no seu site solicitando URLs de redirecionamento para arquivos de imagem no seu site. Para evitar esse vazamento de informações de “impressões digitais em midias sociais”, hospede todas as imagens e seu favicon em um domínio separado.Enabling
redirect_authenticated_usercan also result in a redirect loop when using thepermission_required()decorator unless theraise_exceptionparameter is used.
- success_url_allowed_hosts¶
A
setof hosts, in addition torequest.get_host(), that are safe for redirecting after login. Defaults to an emptyset.
- get_default_redirect_url()[código-fonte]¶
Returns the URL to redirect to after login. The default implementation resolves and returns
next_pageif set, orLOGIN_REDIRECT_URLotherwise.
Isto é o que “LoginView” faz:
Se for chamado via
GET, ele mostrará um formulário de login que enviará um POST para a mesma URL. Explicaremos isso melhor em um instante.Se for chamado via
POST, com as credenciais enviadas pelo usuário, ele vai tentar logar o usuário. Se o login der certo, a view irá redirecionar para a URL especificada emnext. Senextnão tiver sido definido, então a view redirecionará parasettings.LOGIN_REDIRECT_URL(which defaults to/accounts/profile/). Se o login não der certo, o formulário de login será exibido novamente.
A responsabilidade de colocar o html, para o template de login, é toda sua. Esse template se chama
registration/login.htmlpor padrão. Ele recebe 4 variáveis de contexto de template.form: Um objetoFormque representa aAuthenticationForm.next: A URL para a qual será redirecionado depois de uma autenticação bem sucedida. Esta pode conter também uma “query string”.site: A currentSiteatual, de acordo com a configuraçãoSITE_ID. Se você não tiver o framework de sites instalado, entãositeserá definido como uma instância da classe ofRequestSite, que pegará o nome e o domínio do site daHttpRequestatual.site_name: Um alias/atalho parasite.name. Se você não tiver o framework de sites instalado, entãosite_namereceberá o valor de derequest.META['SERVER_NAME']. Para mais informações sobre sites, veja The “sites” framework.
Caso prefira não chamar o template :arquivo:`registration/login.html`, você pode passar o parâmetro
template_namecomo argumento extra para o método ``as_view` na sua URLconf. Por exemplo, esta linha URLconf usaria :arquivo:`myapp/login.html` como alternativa:path("accounts/login/", auth_views.LoginView.as_view(template_name="myapp/login.html")),
Você também pode escolher o nome do campo
GETque contém a URL para redirecionar após o login usandoredirect_field_name. Por padrão, o campo é chamado denext.Você pode usar o seguinte exemplo de template
registration/login.htmlcomo ponto de partida. Esse exemplo assume que você tenha um templatebase.htmlque defina um blococontent:{% 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 set up the password_reset view in your URLconf #} <p><a href="{% url 'password_reset' %}">Lost password?</a></p> {% endblock %}
If you have customized authentication (see Customizing Authentication) you can use a custom authentication form by setting the
authentication_formattribute. This form must accept arequestkeyword argument in its__init__()method and provide aget_user()method which returns the authenticated user object (this method is only ever called after successful form validation).
- class LogoutView[código-fonte]¶
Logs a user out on
POSTrequests.Nome da URL:
logoutAtributos:
- next_page¶
The URL to redirect to after logout. Defaults to
LOGOUT_REDIRECT_URL.
- template_name¶
The full name of a template to display after logging the user out. Defaults to
registration/logged_out.html.
- redirect_field_name¶
The name of a
GETfield containing the URL to redirect to after log out. Defaults to'next'. Overrides thenext_pageURL if the givenGETparameter is passed.
- extra_context¶
A dictionary of context data that will be added to the default context data passed to the template.
- success_url_allowed_hosts¶
A
setof hosts, in addition torequest.get_host(), that are safe for redirecting after logout. Defaults to an emptyset.
Contexto de Template:
title: Versão localizada da string “Logged out” (deslogado). Ou seja, você pode substituir “Logged out” por uma versão traduziada (como deslogado) para o idioma que desejar.site: A currentSiteatual, de acordo com a configuraçãoSITE_ID. Se você não tiver o framework de sites instalado, entãositeserá definido como uma instância da classe ofRequestSite, que pegará o nome e o domínio do site daHttpRequestatual.site_name: Um alias/atalho parasite.name. Se você não tiver o framework de sites instalado, entãosite_namereceberá o valor de derequest.META['SERVER_NAME']. Para mais informações sobre sites, veja The “sites” framework.
- logout_then_login(request, login_url=None)[código-fonte]¶
Logs a user out on
POSTrequests, then redirects to the login page.Nome da URL: não é fornecido uma URL padrão.
Argumentos opcionais:
login_url: a URL da página de login, para onde o usuário deve ser redirecionado. Caso esse parâmetro não seja passado, ele irá tomar o o valorsettings.LOGIN_URLpor padrão.
- class PasswordChangeView[código-fonte]¶
Nome da URL:
password_changePermite a um usuário alterar sua senha.
Atributos:
- template_name¶
The full name of a template to use for displaying the password change form. Defaults to
registration/password_change_form.htmlif not supplied.
- success_url¶
The URL to redirect to after a successful password change. Defaults to
'password_change_done'.
- form_class¶
A custom “change password” form which must accept a
userkeyword argument. The form is responsible for actually changing the user’s password. Defaults toPasswordChangeForm.
- extra_context¶
A dictionary of context data that will be added to the default context data passed to the template.
Contexto de Template:
form: The password change form (seeform_classabove).
- class PasswordChangeDoneView[código-fonte]¶
Nome da URL:
password_change_doneA pagina que é exibida após um usuário ter alterado sua senha.
Atributos:
- template_name¶
The full name of a template to use. Defaults to
registration/password_change_done.htmlif not supplied.
- extra_context¶
A dictionary of context data that will be added to the default context data passed to the template.
- class PasswordResetView[código-fonte]¶
Nome da URL:
password_resetGera um link de uso único, que permite o usuário cadastrar uma nova senha. Esse link será enviado para o e-mail do usuário.
This view will send an email if the following conditions are met:
The email address provided exists in the system.
The requested user is active (
User.is_activeisTrue).The requested user has a usable password. Users flagged with an unusable password (see
set_unusable_password()) aren’t allowed to request a password reset to prevent misuse when using an external authentication source like LDAP.
If any of these conditions are not met, no email will be sent, but the user won’t receive any error message either. This prevents information leaking to potential attackers. If you want to provide an error message in this case, you can subclass
PasswordResetFormand use theform_classattribute.Nota
Be aware that sending an email costs extra time, hence you may be vulnerable to an email address enumeration timing attack due to a difference between the duration of a reset request for an existing email address and the duration of a reset request for a nonexistent email address. To reduce the overhead, you can use a 3rd party package that allows to send emails asynchronously, e.g. django-mailer.
Atributos:
- template_name¶
The full name of a template to use for displaying the password reset form. Defaults to
registration/password_reset_form.htmlif not supplied.
- form_class¶
Form that will be used to get the email of the user to reset the password for. Defaults to
PasswordResetForm.
- email_template_name¶
The full name of a template to use for generating the email with the reset password link. Defaults to
registration/password_reset_email.htmlif not supplied.
- subject_template_name¶
The full name of a template to use for the subject of the email with the reset password link. Defaults to
registration/password_reset_subject.txtif not supplied.
- token_generator¶
Instance of the class to check the one time link. This will default to
default_token_generator, it’s an instance ofdjango.contrib.auth.tokens.PasswordResetTokenGenerator.
- success_url¶
The URL to redirect to after a successful password reset request. Defaults to
'password_reset_done'.
- from_email¶
A valid email address. By default Django uses the
DEFAULT_FROM_EMAIL.
- extra_context¶
A dictionary of context data that will be added to the default context data passed to the template.
- html_email_template_name¶
The full name of a template to use for generating a text/html multipart email with the password reset link. By default, HTML email is not sent.
- extra_email_context¶
A dictionary of context data that will be available in the email template. It can be used to override default template context values listed below e.g.
domain.
Contexto de Template:
form: The form (seeform_classabove) for resetting the user’s password.
O contexto do template do email:
email: um apelido parauser.emailuser: o usuário do tipoUser, de acordo com o campo doemaildo formulário. Somente usuários ativos conseguem resetar suas senhas (User.is_active is True).site_name: Um alias/atalho parasite.name. Se você não tiver o framework de sites instalado, entãosite_namereceberá o valor de derequest.META['SERVER_NAME']. Para mais informações sobre sites, veja The “sites” framework.domain: um apelido parasite.domain. Se você não tem o framework “site” instalado, este parâmetro será setado com o valor dorequest.get_host().protocol: http ou httpsuid: a chave primária do usuário codificada em base 64token: o “Token” para verificar se o link de reset é valido.
Exemplo de
registration/password_reset_email.html(template do corpo do email):Someone asked for password reset for email {{ email }}. Follow the link below: {{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
O mesmo contexto de template é usado para o template do assunto. O assunto de ser uma única em uma string de texto plano.
- class PasswordResetDoneView[código-fonte]¶
Nome da URL:
password_reset_doneThe page shown after a user has been emailed a link to reset their password. This view is called by default if the
PasswordResetViewdoesn’t have an explicitsuccess_urlURL set.Nota
Se o endereço de email não existir no sistema, ou o usuário for inativo, ou ainda se a senha é inutilizável, o usuário será redirecionado para esta “view” mas nenhum email será enviado.
Atributos:
- template_name¶
The full name of a template to use. Defaults to
registration/password_reset_done.htmlif not supplied.
- extra_context¶
A dictionary of context data that will be added to the default context data passed to the template.
- class PasswordResetConfirmView[código-fonte]¶
Nome da URL:
password_reset_confirmApresenta uma formulário para informar uma nova senha.
Argumentos palavra-chave da URL:
uidb64: The user’s id encoded in base 64.token: Token to check that the password is valid.
Atributos:
- template_name¶
The full name of a template to display the confirm password view. Default value is
registration/password_reset_confirm.html.
- token_generator¶
Instance of the class to check the password. This will default to
default_token_generator, it’s an instance ofdjango.contrib.auth.tokens.PasswordResetTokenGenerator.
- post_reset_login¶
A boolean indicating if the user should be automatically authenticated after a successful password reset. Defaults to
False.
- post_reset_login_backend¶
A dotted path to the authentication backend to use when authenticating a user if
post_reset_loginisTrue. Required only if you have multipleAUTHENTICATION_BACKENDSconfigured. Defaults toNone.
- form_class¶
Form that will be used to set the password. Defaults to
SetPasswordForm.
- success_url¶
URL to redirect after the password reset done. Defaults to
'password_reset_complete'.
- extra_context¶
A dictionary of context data that will be added to the default context data passed to the template.
- reset_url_token¶
Token parameter displayed as a component of password reset URLs. Defaults to
'set-password'.
Contexto de Template:
form: The form (seeform_classabove) for setting the new user’s password.validlink: Boolenano, verdadeiro se o link (combinação deuidb64etoken) é válido ou ainda não utilizado.
- class PasswordResetCompleteView[código-fonte]¶
Nome da URL:
password_reset_completeApresentando a “view” a qual informa ao usuário que sua senha foi alterada com sucesso.
Atributos:
- template_name¶
The full name of a template to display the view. Defaults to
registration/password_reset_complete.html.
- extra_context¶
A dictionary of context data that will be added to the default context data passed to the template.
Funções auxiliares¶
- redirect_to_login(next, login_url=None, redirect_field_name='next')[código-fonte]¶
Redireciona para a página de autenticação, e então retornar a outra URL depois de uma autenticação com sucesso.
Argumentos requeridos:
next: URL para a qual é redirecionado depois de uma autenticação bem sucedida.
Argumentos opcionais:
login_url: a URL da página de login, para onde o usuário deve ser redirecionado. Caso esse parâmetro não seja passado, ele irá tomar o o valorsettings.LOGIN_URLpor padrão.redirect_field_name: The name of aGETfield containing the URL to redirect to after login. Overridesnextif the givenGETparameter is passed.
Formulários embutidos¶
Caso não queira utilizar a “views” embutidas no Django, mas quer a conveniência de não escrever formulários para esta funcionalidade, o sistema de autenticação fornece vários formulários prontos localizados em django.contrib.auth.forms:
Nota
The built-in authentication forms make certain assumptions about the user model that they are working with. If you’re using a custom user model, it may be necessary to define your own forms for the authentication system. For more information, refer to the documentation about using the built-in authentication forms with custom user models.
- class AdminPasswordChangeForm[código-fonte]¶
A form used in the admin interface to change a user’s password, including the ability to set an
unusable password, which blocks the user from logging in with password-based authentication.Recebe o
usercomo primeiro argumento posicional.
- class AdminUserCreationForm[código-fonte]¶
A form used in the admin interface to create a new user. Inherits from
UserCreationForm.It includes an additional
usable_passwordfield, enabled by default. Ifusable_passwordis enabled, it verifies thatpassword1andpassword2are non empty and match, validates the password usingvalidate_password(), and sets the user’s password usingset_password(). Ifusable_passwordis disabled, no password validation is done, and password-based authentication is disabled for the user by callingset_unusable_password().
- class AuthenticationForm[código-fonte]¶
Um formulário para autenticar o usuário.
Recebe o
requestcomo seu primeiro parâmetro posicional, o qual é armazenado na instância do formulário para ser usado pelas sub-classes.- confirm_login_allowed(user)[código-fonte]¶
Por padrão, o
AuthenticationFormrejeita usuários que tenham o indicadoris_activedefinido comoFalse. Você pode alterar este comportamento com uma regra personalizada para determinar quais usuários podem se autenticar. Faça isso com um formulário personalizado que herda aAuthenticationForme sobreescreve o métodoconfirm_login_allowed(). Este método deve emitir umaValidationErrorse o usuário fornecido não deve ser autenticado.Por exemplo, para permitir que todos os usuários se autentiquem independente do status “active”:
from django.contrib.auth.forms import AuthenticationForm class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm): def confirm_login_allowed(self, user): pass
(In this case, you’ll also need to use an authentication backend that allows inactive users, such as
AllowAllUsersModelBackend.)Ou para permitir somente alguns usuários ativos a se autenticarem:
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 BaseUserCreationForm[código-fonte]¶
A
ModelFormfor creating a new user. This is the recommended base class if you need to customize the user creation form.It has three fields:
username(from the user model),password1, andpassword2. It verifies thatpassword1andpassword2match, validates the password usingvalidate_password(), and sets the user’s password usingset_password().
- class PasswordChangeForm[código-fonte]¶
Um formulário para permitir que o usuário altere sua senha.
- class PasswordResetForm[código-fonte]¶
Um formulário para gerar e enviar um email com um link de uso único para resetar a senha do usuário.
- send_mail(subject_template_name, email_template_name, context, from_email, to_email, html_email_template_name=None)[código-fonte]¶
Uses the arguments to send an
EmailMultiAlternatives. Can be overridden to customize how the email is sent to the user. If you choose to override this method, be mindful of handling potential exceptions raised due to email sending failures.- Parâmetros:
subject_template_name – O template para o assunto.
email_template_name – O template para o corpo do email.
context – O contexto passado para o
subject_template,email_template, e para ohtml_email_template(se não forNone).from_email – O email do remetente.
to_email – O email do usuário que requisitou.
html_email_template_name – O template para o corpo HTML; o valor padrão é
None, neste caso um email com texto plano sem marcação é enviado.
By default,
save()populates thecontextwith the same variables thatPasswordResetViewpasses to its email context.
- class SetPasswordForm[código-fonte]¶
Um formulário que permite ao usuário alterar sua senha sem informar a senha antiga.
- class UserChangeForm[código-fonte]¶
Um formulário usado na interface de administração para alterar informações e permissões do usuário.
- class UserCreationForm[código-fonte]¶
Inherits from
BaseUserCreationForm. To help prevent confusion with similar usernames, the form doesn’t allow usernames that differ only in case.
Dados de autenticação nos templates.¶
O usuário atualmente autenticado e suas permissões são disponibilizadas no contexto do template quando você usa a RequestContext.
Tecnicidades
Tecnicamente, estas variáveis somente ficam disponíveis no contexto do template quando se usa a RequestContext e o processador de contexto 'django.contrib.auth.context_processors.auth' estiver habilitado. Ele está no arquivo de definições gerado normalmente. Para mais detalhes, veja os documentos de RequestContext.
Usuários¶
Quando a RequestContext renderiza um template, o usuário autenticado no momento, seja uma instância de User ou uma instância de AnonymousUser, são armazenadas em uma variável de template chamada {{ user }}:
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
Esta variável de template não está disponível se um RequestContext não for usado.
Permissões¶
As permissões do usuário autenticado são armazenadas na variável {{ perms }} do template. Isso é uma instância de django.contrib.auth.context_processors.PermWrapper, o qual é um “proxy” de permissões amigável ao template.
Evaluating a single-attribute lookup of {{ perms }} as a boolean is a proxy
to User.has_module_perms(). For example, to check if
the logged-in user has any permissions in the foo app:
{% if perms.foo %}
Evaluating a two-level-attribute lookup as a boolean is a proxy to
User.has_perm(). For
example, to check if the logged-in user has the permission foo.add_vote:
{% if perms.foo.add_vote %}
Here’s a more complete example of checking permissions in a template:
{% 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 %}
É possível também conferir as permissões através das declarações “{% if in %}”. Por exemplo:
{% if 'foo' in perms %}
{% if 'foo.add_vote' in perms %}
<p>In lookup works, too.</p>
{% endif %}
{% endif %}
Gerenciando usuários no admin¶
Quando você tem instalados “django.contrib.admin” e “django.contrib.auth”, o admin provides um jeito conveniente de visualizar e gerenciar usuários, grupos e permissões. Usuários podem ser criados e deletados como qualquer modelo Django. Grupos podem ser criados, e permissões podem ser dadas a usuários ou grupos. Um registro das edições dos usuários aos modelos é criado no admin e também é armazenado e exibido.
Criando usuários¶
You should see a link to “Users” in the “Auth” section of the main admin index page. The “Add user” admin page is different than standard admin pages in that it requires you to choose a username and password before allowing you to edit the rest of the user’s fields. Alternatively, on this page, you can choose a username and disable password-based authentication for the user.
Também observe: se você quer que uma conta de usuário possa criar usuários usando o site do Django admin, você precisará dar permissão para que essa conta adicione usuários e modifique usuários (por exemplo, as permissões “Adicionar usuário” e “Modificar usuário”). Se uma conta tem a permissão de adicionar usuários, mas não de modificá-los, então a conta não poderá adicionar usuários. Por quê? Porque se você tem permissão de adicionar usuários, você tem poder de criar superusuários, que pode, então, criar outros usuários. Então o Django exige permissões para adicionar e modificar como uma leve medida de segurança.
Seja consciente sobre como você permite aos usuários que gerenciem as permissões. Se você dá a habilidade de editar usuários a um não superusuário, isso, em última instância, é o mesmo que dá-lo a condição de superusuário, já que ele poderá elevar permissões de usuários, inclusive dele mesmo!
Mudando as senhas¶
User passwords are not displayed in the admin (nor stored in the database), but the password storage details are displayed. Included in the display of this information is a link to a password change form that allows admins to change or unset user passwords.