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.Userarmazena informações sobre os utilizadores (nome, palavra-passe hash, email, etc.). - Grupos: O modelo
django.contrib.auth.models.Groupagrupa utilizadores para facilitar a gestão de permissões. - Permissões: O modelo
django.contrib.auth.models.Permissiondefine 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, é usadodjango.contrib.auth.backends.ModelBackend.
Processo de autenticação:
- O utilizador envia login e palavra-passe (normalmente através de um formulário).
- Django chama o método
authenticate()dos backends configurados, passando as credenciais. - O backend procura o utilizador pelo login.
- Se encontrar o utilizador, verifica a palavra-passe (comparando hashes).
- Se a verificação for bem-sucedida,
authenticate()devolve o objeto utilizador. - 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.