O Django disponibiliza um robusto sistema de autenticação nativo, localizado no módulo django.contrib.auth, que lida com contas de usuário, grupos, permissões e sessões de forma integrada. Abaixo, detalhamos as principais funcionalidades e métodos deste sistema.
Principais Métodos do Sistema de Autenticação
| Função / Decorador | Finalidade |
|---|---|
create_user |
Criação de novos registros de usuários comuns. |
authenticate |
Verificação de credenciais (usuário e senha). |
login |
Vincula o usuário autenticado à sessão atual. |
logout |
Encerra a sessão do usuário e limpa os dados. |
is_authenticated |
Atributo para checar se o usuário está logado. |
@login_required |
Restringe o acesso a views apenas para usuários autenticados. |
Fluxo de Autenticação
Para validar um usuário e iniciar uma sessão, utilizamos os métodos authenticate e login. O authenticate verifica se as credenciais coincidem com o banco de dados, enquanto o login gerencia o cookie de sessão e anexa o objeto de usuário ao request.user.
from django.contrib import auth
from django.shortcuts import redirect, render
def realizar_autenticacao(request):
nome_usuario = request.POST.get("username")
senha_usuario = request.POST.get("password")
# Retorna o objeto User se válido, ou None se inválido
usuario_validado = auth.authenticate(username=nome_usuario, password=senha_usuario)
if usuario_validado is not None:
# Registra o usuário na sessão do Django
auth.login(request, usuario_validado)
return redirect("/dashboard/")
else:
return render(request, "login.html", {"erro": "Credenciais inválidas"})
Proteção de Views e Configuração de Redirecionamento
O decorador @login_required é a forma mais simples de proteger rotas. Caso um usuário aônimo tente acessar a view, o Django o redirecionará para a URL definida nas configurações globais.
from django.contrib.auth.decorators import login_required
@login_required
def painel_usuario(request):
# Acessando dados do usuário logado via request
nome = request.user.username
return render(request, "perfil.html", {"nome": nome})
No arquivo settings.py, defina para onde o usuário deve ser enviado caso não esteja autenticado:
# Configuração de redirecionamento padrão
LOGIN_URL = "/auth/login/"
Criação de Usuários
Diferente de objetos comuns do Django, a criação de usuários requer o tratamento de hash de senhas. Utilize os métodos específicos do UserManager:
from django.contrib.auth.models import User
# Criando um usuário padrão com senha criptografada
novo_membro = User.objects.create_user(username="dev_junior", password="senha_segura_123")
novo_membro.email = "junior@exemplo.com"
novo_membro.save()
# Criando um administrador com privilégios totais
admin_sistema = User.objects.create_superuser(username="admin_master", password="root_password")
Finalizando Sessões
A função logout limpa completamente os dados da sessão no banco de dados e no navegador do cliente, similar ao comportamento do request.session.flush().
def encerrar_sessao(request):
auth.logout(request)
return redirect("/home/")
Personalização do Modelo de Usuário
Muitas vezes, os campos padrão (username, password, email) não são suficientes. Para estender a funcionalidade, recomenda-se herdar de AbstractUser. Isso permite adicionar novos campos mantendo o comportamento padrão do framework.
from django.contrib.auth.models import AbstractUser
from django.db import models
class PerfilCustomizado(AbstractUser):
cpf = models.CharField(max_length=14, unique=True)
biografia = models.TextField(blank=True)
data_nascimento = models.DateField(null=True)
Após criar o modelo customizado, é obrigatório informar ao Django para utilizá-lo no settings.py:
# Indica o novo modelo como referência para o sistema de auth
AUTH_USER_MODEL = "usuarios.PerfilCustomizado"
Ao utilizar um modelo customizado, as funções do módulo auth continuarão funcionando normalmente, mas farão referência à sua nova classe de usuário.