
Full Stack Developer
Como usar Grupos e Permissões no Django com um Exemplo de API Segura
O Django é um framework web poderoso que já vem com um sistema robusto de autenticação e controle de acesso. Com ele, é possível criar grupos de usuários e definir permissões específicas para controlar o que cada grupo pode fazer em sua aplicação. Neste post, vamos entender como funcionam os grupos e permissões no Django e, ao final, apresentar um exemplo prático aplicado a um cenário de API com diferentes níveis de acesso.
O que são Grupos e Permissões no Django?
Grupos: são coleções de permissões. Você pode atribuir um grupo a um usuário, e esse usuário herdará todas as permissões do grupo.
- Permissões: são regras que controlam o que um usuário pode ou não pode fazer. Elas estão associadas a ações básicas em modelos (
add
,change
,delete
,view
), mas também podem ser personalizadas.
A grande vantagem desse sistema é centralizar a lógica de autorização e facilitar a manutenção da segurança do seu sistema.
O que são ContentTypes e por que usá-los?
O Django utiliza o modelo ContentType
para representar todas as tabelas (models) registradas no projeto. Ele serve como uma forma genérica de referenciar qualquer modelo do sistema. Ao criar permissões personalizadas, o ContentType
indica a qual modelo a permissão se refere. Dessa forma, quando dizemos que um grupo tem a permissão view_report
, o Django entende que essa permissão está relacionada ao model Report
, porque usamos o ContentType
correspondente.
Esse vínculo entre Permission
e ContentType
permite que o sistema de permissões seja dinâmico e funcione com qualquer modelo da aplicação.
Exemplo prático: Criando uma API com controle de acesso por grupo
Imagine que temos uma API que fornece dados sensíveis, como relatórios. Queremos restringir o acesso a esses endpoints com base em dois grupos:
API Reader
: pode acessar apenas endpoints de leitura.API Writer
: tem acesso a endpoints de leitura e escrita.
1. Criando os grupos e permissões
Você pode criar grupos e permissões via admin do Django ou via script:
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from myapp.models import Report # exemplo de model
# Criando grupos
reader_group, _ = Group.objects.get_or_create(name='API Reader')
writer_group, _ = Group.objects.get_or_create(name='API Writer')
# Permissões personalizadas
content_type = ContentType.objects.get_for_model(Report)
view_permission = Permission.objects.get(
codename='view_report',
content_type=content_type,
)
change_permission = Permission.objects.get(
codename='change_report',
content_type=content_type,
)
# Atribuindo permissões aos grupos
reader_group.permissions.add(view_permission)
writer_group.permissions.add(view_permission, change_permission)
2. Protegendo a view com base nas permissões
from rest_framework.permissions import BasePermission
class HasReportAccess(BasePermission):
def has_permission(self, request, view):
return request.user.has_perm('myapp.view_report')
class HasReportEditAccess(BasePermission):
def has_permission(self, request, view):
return request.user.has_perm('myapp.change_report')
3. Exemplo de uso em uma ViewSet
from rest_framework import viewsets
from .models import Report
from .serializers import ReportSerializer
from .permissions import HasReportAccess, HasReportEditAccess
class ReportViewSet(viewsets.ModelViewSet):
queryset = Report.objects.all()
serializer_class = ReportSerializer
def get_permissions(self):
if self.action in ['list', 'retrieve']:
return [HasReportAccess()]
if self.action in ['update', 'partial_update']:
return [HasReportEditAccess()]
return super().get_permissions()
4. Como um usuário é autenticado e associado a um grupo
Na criação de um usuário da API, você pode associá-lo a um grupo:
user = User.objects.create_user(username='api_user')
user.groups.add(Group.objects.get(name='API Reader'))
Conclusão
O sistema de grupos e permissões do Django é poderoso e altamente personalizável. Com poucos ajustes, você consegue proteger seus endpoints, delegar responsabilidades e manter a segurança da sua aplicação. Ao usar grupos para agrupar permissões, você facilita a escalabilidade e a manutenção do controle de acesso no sistema.
Tags:
#python #programação #desenvolvimentoweb #backend #aprendapython #tecnologia #devVisualizações:
125Comentários (0)
Efetue login para poder comentar. Ainda não tem uma conta? Registre-se