A autenticação é uma das principais funcionalidades em um sistema. É com ela que protegemos as funcionalidades de uma aplicação e permitimos que estas só sejam acessadas por usuários cadastrados e autenticados previamente.
O Django possui um módulo de autenticação extremamente completo e fácil de implementar, como veremos neste artigo.
Para a construção deste projeto, vamos iniciá-lo apenas com uma página index
que exibirá uma mensagem “Página protegida”. É ela quem vamos restringir para que apenas usuários autenticados possuam acesso.
Lembrando que este projeto está neste repositório.
Cadastrando usuários
Para autenticar os usuários, primeiro precisamos cadastrá-los no banco de dados. O Django possui, em seu módulo de segurança, toda uma base para este cadastro. Para utilizá-la, vamos até o arquivo views.py da nossa aplicação e criamos o seguinte método:
def cadastrar_usuario(request):
if request.method == "POST":
form_usuario = UserCreationForm(request.POST)
if form_usuario.is_valid():
form_usuario.save()
return redirect('index')
else:
form_usuario = UserCreationForm()
return render(request, 'cadastro.html', {'form_usuario': form_usuario})
O método acima é bem simples. Basicamente, ele cria uma instância do UserCreationForm
passando todos os dados da requisição (dados do usuário a ser cadastrado no BD), verifica se estes dados são válidos e os persiste no banco de dados.
Lembrando que o UserCreationForm
é um Form do próprio Django utilizado para cadastrar usuários no projeto.
Para que os dados sejam cadastrados, precisamos de um template para interagir com o usuário da aplicação. Sendo assim, o arquivo cadastro.html
foi criado com o seguinte conteúdo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Cadastro de usuários</title>
</head>
<body>
<form method="post">
{% csrf_token %}
<div class="form-group">
{{form_usuario.username.errors}}
<label>Username: </label>
{{form_usuario.username}}
</div>
<div class="form-group">
{{form_usuario.password1.errors}}
<label>Senha: </label>
{{form_usuario.password1}}
</div>
<div class="form-group">
{{form_usuario.password2.errors}}
<label>Confirmação de senha: </label>
{{form_usuario.password2}}
</div>
<div class="form-group">
<input type="submit" value="Cadastrar" class="btn btn-primary">
</div>
</form>
</body>
</html>
O template possui apenas um formulário com os dados que um usuário deve possuir para salvá-lo no banco de dados do projeto (username e password).
Curso Django - Fundamentos
Conhecer o cursoAlém disso, precisamos definir uma rota para o usuário conseguir acessar o formulário. Para isso, no arquivo urls.py, definimos o seguinte conteúdo:
from django.contrib import admin
from django.urls import path, include
from .views import *
urlpatterns = [
path('cadastrar_usuario', cadastrar_usuario, name="cadastrar_usuario"),
path('index', index, name="index"),
]
Agora, ao acessar a rota /cadastrar_usuario
, o seguinte formulário será renderizado:
Ao preencher o formulário e submetê-lo, um novo usuário será criado no banco de dados do projeto, mais especificamente na tabela auth_user
:
Podemos notar que o usuário foi salvo com sucesso e que sua senha foi criptografada utilizando o sha256
. Além disso, o usuário joao12 ainda não se autenticou na aplicação (o que vamos fazer no próximo tópico) e que há algumas informações em branco (first_name e email), já que estas não são obrigatórias no projeto.
Agora, precisamos utilizar estas informações no banco de dados e autenticar os usuários em nossa aplicação.
Autenticando usuários
Após cadastrar os usuários no banco de dados do projeto, vamos utilizar estas informações para autenticá-los. Para isso, o primeiro passo é criar o template (login.html) onde o próprio usuário poderá preencher com seus dados de login:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{% csrf_token %}
<div class="form-group">
{{form_login.username.errors}}
<label>Username: </label>
{{form_login.username}}
</div>
<div class="form-group">
{{form_login.password.errors}}
<label>Senha: </label>
{{form_login.password}}
</div>
<div class="form-group">
<input type="submit" value="Enviar" class="btn btn-primary">
</div>
</form>
</body>
</html>
O formulário de login é bem simples. Precisamos apenas dos campos username
e password
para autenticar um usuário no banco de dados. De posse dessas informações, enviamos a requisição para o método logar_usuario
do arquivo views.py do projeto, que capturará estes dados e logará o usuário na aplicação (caso os dados estejam corretos):
def logar_usuario(request):
if request.method == "POST":
username = request.POST["username"]
password = request.POST["password"]
usuario = authenticate(request, username=username, password=password)
if usuario is not None:
login(request, usuario)
return redirect('index')
else:
form_login = AuthenticationForm()
else:
form_login = AuthenticationForm()
return render(request, 'login.html', {'form_login': form_login})
O método logar_usuario
é bem simples. Ele irá capturar os dados enviados por meio do formulário e os utilizará para autenticar um novo usuário por meio do método authenticate
do Django.
Este método irá verificar se os dados de login estão corretos (de acordo com os dados presentes no banco de dados) e salvar a resposta na variável usuario
. Há dois retornos possíveis para o método authenticate
: None, se os dados informados estiverem incorretos, e o usuário, caso os dados estejam corretos.
Verificamos este retorno e, caso o usuário exista no banco de dados, utilizamos o método login
para logá-lo na aplicação. A partir daí, este usuário estará autenticado no projeto :)
Lembrando que precisamos criar a rota responsável por executar o método logar_usuario
no arquivo views.py
:
from django.contrib import admin
from django.urls import path, include
from .views import *
urlpatterns = [
path('logar_usuario', logar_usuario, name="logar_usuario"),
path('cadastrar_usuario', cadastrar_usuario, name="cadastrar_usuario"),
path('index', index, name="index"),
]
Agora, ao acessar a rota localhost:8000/logar_usuario
, o formulário de login será exibido para que possamos informar as credenciais do usuário e autenticá-lo na aplicação:
Notem que o campo last_login
foi preenchido com a data e hora do último login do usuário (o id do usuário mudou porque tinha esquecido sua senha, então tive que recriá-lo :P )
Com isso, já estamos com os métodos de login e cadastro de usuários prontos e funcionais. O próximo passo é incrementar nosso módulo de autenticação, adicionando os métodos de logout, alterar senha e proteger páginas para que apenas usuários logados possuam acesso, mas isso nós vamos fazer nos próximos artigos desta série de autenticação com Django. Até lá :)