Banner do topo
Logo
Translate
Imagem de capa da postagem
Cristiano

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 #dev

Comentários (0)