Sobes.tech
Middle

Como funciona o sistema de autenticação no Django?

sobes.tech IA

Resposta da IA

No Django, a autenticação baseia-se num backend plug-in que gere utilizadores, grupos e permissões.

Componentes principais:

  • Utilizadores: O modelo django.contrib.auth.models.User armazena informações sobre os utilizadores (nome, palavra-passe hash, email, etc.).
  • Grupos: O modelo django.contrib.auth.models.Group agrupa utilizadores para facilitar a gestão de permissões.
  • Permissões: O modelo django.contrib.auth.models.Permission define o que um utilizador pode fazer (ver, adicionar, alterar, eliminar modelos).
  • Backends de autenticação: Classes que implementam métodos para autenticar (authenticate) e autorizar (get_user, has_perm, has_module_perms). Por padrão, é usado django.contrib.auth.backends.ModelBackend.

Processo de autenticação:

  1. O utilizador envia login e palavra-passe (normalmente através de um formulário).
  2. Django chama o método authenticate() dos backends configurados, passando as credenciais.
  3. O backend procura o utilizador pelo login.
  4. Se encontrar o utilizador, verifica a palavra-passe (comparando hashes).
  5. Se a verificação for bem-sucedida, authenticate() devolve o objeto utilizador.
  6. Django chama login() (na vista ou middleware), que estabelece a sessão para o utilizador.

Exemplo de uso numa vista:

# views.py
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect

def login_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            return redirect('some_success_page')
        else:
            # Tratamento do erro de autenticação
            pass
    return render(request, 'login.html')

Principais funções e decoradores para verificar autenticação e permissões:

  • @login_required: Decorador para vistas que requerem autenticação.
  • @permission_required('app_label.permission_code'): Decorador que requer uma permissão específica.
  • user.is_authenticated: Verifica se o utilizador está autenticado.
  • user.has_perm('app_label.permission_code'): Verifica se o utilizador tem uma permissão específica.
  • user.has_module_perms('app_label'): Verifica permissões num módulo da aplicação.

Configuração:

  • AUTHENTICATION_BACKENDS: Lista de backends registados. Por padrão: ['django.contrib.auth.backends.ModelBackend'].
  • LOGIN_URL: URL para redirecionar utilizadores não autenticados ao usar @login_required.
  • LOGIN_REDIRECT_URL: URL para redirecionar após login bem-sucedido.