Continuando a implementação do módulo de autenticação em uma aplicação Django que iniciamos no artigo “Implementando autenticação no Django – Parte 1”, veremos neste artigo como implementar os métodos de logout, alterar senha do usuário e proteger páginas para que só sejam acessadas por usuários devidamente autenticados.
Logout
A principal função do método de logout
é remover a sessão do usuário que está logado na aplicação, fazendo com que este login não esteja mais ativo no sistema. Assim como o método de login
, o Django possui, em seu módulo de autenticação, o método para deslogar usuários. Para implementá-lo, basta criar um método no arquivo views.py
com o seguinte conteúdo:
def deslogar_usuario(request):
logout(request)
return redirect('index')
Basicamente, o médoto deslogar_usuario
recebe uma requisição e remove o usuário que está logado dela. Simplesmente assim :)
Curso Django - Fundamentos
Conhecer o cursoAgora, para acessar o método de deslogar_usuario
, precisamos criar sua rota no arquivo urls.py da aplicação:
from django.contrib import admin
from django.urls import path, include
from .views import *
urlpatterns = [
path('logar_usuario', logar_usuario, name="logar_usuario"),
path('deslogar_usuario', deslogar_usuario, name="deslogar_usuario"),
path('cadastrar_usuario', cadastrar_usuario, name="cadastrar_usuario"),
path('index', index, name="index"),
]
Com isso, ao acessar a rota http://localhost:8000/deslogar_usuario
, a sessão será destruída e o usuário deslogado do nosso projeto.
Alterar senha do usuário
Uma outra funcionalidade importante para um sistema de autenticação é o método para alterar senha do usuário logado. Com o Django, esta implementação é bem simples.
Primeiro, vamos criar um método alterar_senha
no arquivo views.py
do projeto com o seguinte conteúdo:
def alterar_senha(request):
if request.method == "POST":
form_senha = PasswordChangeForm(request.user, request.POST)
if form_senha.is_valid():
user = form_senha.save()
update_session_auth_hash(request, user)
return redirect('index')
else:
form_senha = PasswordChangeForm(request.user)
return render(request, 'alterar_senha.html', {'form_senha': form_senha})
Basicamente, este método irá criar um PasswordChangeForm
vazio para que o usuário que estiver logado digite as informações necessárias para alteração de senha (senha antiga, nova senha e confirmação da nova senha). Depois que o usuário submeter o formulário, verificamos se ele é válido e, caso positivo, alteramos a senha do usuário com o método update_session_auth_hash
e redirecionamos para a página index
da aplicação.
Para que o usuário consiga digitar as informações necessárias para alterar sua senha, criaremos um template chamado alterar_senha
no diretório templates
da nossa aplicação. Ele é bem simples, apenas renderizamos os inputs necessários para esta funcionalidade:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Alterar senha</title>
</head>
<body>
<form method="post">
{% csrf_token %}
<div class="form-group">
{{form_senha.old_password.errors}}
<label>Senha antiga: </label>
{{form_senha.old_password}}
</div>
<div class="form-group">
{{form_senha.new_password1.errors}}
<label>Nova senha: </label>
{{form_senha.new_password1}}
</div>
<div class="form-group">
{{form_senha.new_password2.errors}}
<label>Confirmação de senha: </label>
{{form_senha.new_password2}}
</div>
<div class="form-group">
<input type="submit" value="Alterar" class="btn btn-primary">
</div>
</form>
</body>
</html>
Por fim, precisamos criar a rota responsável por executar o método alterar_senha
. Para isso, no arquivo urls.py
da aplicação, adicionamos a seguinte linha no array urlpatterns
:
path('alterar_senha/', alterar_senha, name='alterar_senha'),
Com isso, ao acessar a rota http://localhost:8000/alterar_senha
, veremos o seguinte resultado:
É por meio desta página que o usuário poderá alterar sua senha na aplicação.
Proteger páginas
Sabemos que a principal vantagem de implementar a autenticação em nossas aplicações é a de proteger páginas e recursos para que apenas usuários devidamente autenticados possam acessá-las. Para isso, só precisamos adicionar o decorator login_required
nos métodos que queremos proteger:
@login_required(login_url='/logar_usuario')
def index(request):
return render(request, 'index.html')
@login_required(login_url='/logar_usuario')
def deslogar_usuario(request):
logout(request)
return redirect('index')
@login_required(login_url='/logar_usuario')
def alterar_senha(request):
if request.method == "POST":
form_senha = PasswordChangeForm(request.user, request.POST)
if form_senha.is_valid():
user = form_senha.save()
update_session_auth_hash(request, user)
return redirect('index')
else:
form_senha = PasswordChangeForm(request.user)
return render(request, 'alterar_senha.html', {'form_senha': form_senha})
Agora, ao tentar acessar as páginas para alterar senha, deslogar usuário e index, o Django irá verificar se existe algum usuário logado e, caso contrário, redirecionará para a página de login.
Conclusão
Nesta série de artigo, vimos o quão fácil é implementar os principais recursos de autenticação com o Django. A autenticação é a melhor forma de garantir que os recursos de um projeto só sejam acessados por usuário previamente cadastrados e autenticados, garantindo uma maior segurança do projeto.
Lembrando que o código-fonte deste projeto se encontra neste repositório