Mappers (Mapeamento de Atributos do Gov.br)¶
O django-auth-govbr utiliza o padrão Chain of Responsibility (Cadeia de Responsabilidade) para converter o dicionário de atributos do cidadão retornado pelo Gov.br (user_info) em campos do modelo User do Django.
Como Funcionam os Mappers¶
A cadeia de mappers (USER_INFO_MAPPERS) é executada imediatamente após a consulta dos fetchers. Cada mapper recebe o dicionário user_info unificado e o dicionário de campos attrs a ser aplicado no modelo User.
[user_info consolidado] ──> Mapper 1 (DefaultAttrMapUserMapper)
│ attrs = {'username': '12345678900', 'email': '...'}
▼
Mapper 2 (Mapper Customizado / Permissões)
│ attrs final
▼
GovBrAuthBackend (get_or_create)
Configuração: USER_INFO_MAPPERS¶
No settings.py, configure a lista de mappers em GOVBR_AUTH:
GOVBR_AUTH = {
# ...
"USER_INFO_MAPPERS": [
"django_govbr_auth.mappers.DefaultAttrMapUserMapper",
"meu_app.mappers.CustomGovBrMapper",
],
}
Mapper Padrão: DefaultAttrMapUserMapper¶
O mapper padrão aplica as regras definidas no dicionário USER_ATTR_MAP em GOVBR_AUTH.
Formatos de Regras em USER_ATTR_MAP¶
1. Mapeamento Direto ou Dotted Path¶
"USER_ATTR_MAP": {
"username": "sub", # CPF do cidadão no Gov.br
"email": "email",
"orgao": "vinculo.orgao",# acessa dicionário aninhado
}
2. Dicionário Bruto Completo (fulljson)¶
"USER_ATTR_MAP": {
"govbr_data": "fulljson", # atribui o dict user_info completo ao campo
}
3. Divisão de Nome Completo (Tupla)¶
"USER_ATTR_MAP": {
("first_name", "last_name"): "name",
# "Ana Maria Silva" -> first_name="Ana", last_name="Maria Silva"
}
4. Lambdas e Callables Customizados¶
"USER_ATTR_MAP": {
"is_staff": lambda info: info.get("sub") in LISTA_ADMINISTRADORES,
}
5. Especificação com Transformadores (dict spec)¶
"USER_ATTR_MAP": {
"cpf_formatado": {
"key": "sub",
"transform": "django_govbr_auth.transformers.format_cpf",
},
"foto": {
"key": "picture",
"transform": "django_govbr_auth.transformers.fetch_image_file",
},
}
Transformadores Embutidos (django_govbr_auth.transformers)¶
fetch_image_file: baixa a imagem e retorna umContentFiledo Django.parse_date: converte string de data ISO emdatetime.date.format_cpf: formata CPF (XXX.XXX.XXX-XX).to_upper/to_lower/to_bool.
Criando um Mapper Customizado¶
Para criar um mapper customizado, herde de BaseUserMapper (ou do seu alias BaseGovBrUserMapper):
# meu_app/mappers.py
from django_govbr_auth.mappers import BaseUserMapper
class CustomGovBrMapper(BaseUserMapper):
"""Mapper que atribui permissões corporativas com base nos atributos do Gov.br."""
def map_attributes(self, user_info, attrs=None):
attrs = super().map_attributes(user_info, attrs)
# Exemplo: define is_staff caso o cidadão possua selo de confiabilidade Prata ou Ouro
if user_info.get("nivel_confiabilidade") in ("prata", "ouro"):
attrs["is_staff"] = True
return attrs
Funções Utilitárias da API de Mappers¶
get_user_info_mappers(cfg=None): retorna a lista de instâncias dos mappers configurados.run_user_info_mapper_chain(user_info, attr_map=None, cfg=None): executa a cadeia de mappers e retorna o dicionárioattrsfinal.