Gerenciamento de Autenticação e Autorização com o Django Auth

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.

Tags: Django Python authentication Web-Security backend

Publicado em 6-8 16:04 por Thomas