Especialização em Sistemas com Python 3.12+ • Capítulo 13


🎯 Demonstração Prática: Repositório Genérico Tipado e Auditoria de ACL com Álgebra de Sets

O exemplo abaixo combina programação genérica com estruturas hash de alta performance:

  • Implementação de um repositório genérico em memória (RepositorioGenerico[T]) com busca indexada em tempo $O(1)$.
  • Emprego de álgebra de conjuntos (set) com operadores |, &, - para auditoria de permissões e controle de acesso baseado em papéis (RBAC).
  • Estatísticas de acessos utilizando collections.Counter e agregação com collections.defaultdict.
"""
demonstracao_generics_e_hash.py
Repositório Genérico Tipado, Álgebra de Conjuntos (Sets) e Análise de Acessos com Hash.
Compatível com Python 3.12+.
"""

from __future__ import annotations

from collections import Counter, defaultdict
from dataclasses import dataclass, field
from datetime import datetime, timezone
from typing import Final, Generic, Iterator, TypeVar
import uuid

# ==============================================================================
# 1. ESTRUTURA GENÉRICA DE REPOSITÓRIO (PEP 484 / PEP 695)
# ==============================================================================
T = TypeVar("T")

class RepositorioGenerico(Generic[T]):
    """Repositório genérico de entidades indexadas por UUID em tempo O(1)."""
    def __init__(self) -> None:
        self._indices: dict[str, T] = {}

    def inserir(self, chave: str, entidade: T) -> None:
        if chave in self._indices:
            raise KeyError(f"Identificador já existente no repositório: {chave}")
        self._indices[chave] = entidade

    def obter(self, chave: str) -> T | None:
        return self._indices.get(chave)

    def remover(self, chave: str) -> bool:
        return self._indices.pop(chave, None) is not None

    def __len__(self) -> int:
        return len(self._indices)

    def __iter__(self) -> Iterator[T]:
        return iter(self._indices.values())

# ==============================================================================
# 2. MODELO DE DOMÍNIO E AUDITORIA DE CONTROLE DE ACESSO (RBAC)
# ==============================================================================
@dataclass(slots=True)
class PerfilAcesso:
    id_usuario: str
    nome: str
    departamento: str
    privilegios_ativos: set[str] = field(default_factory=set)

# Conjuntos Globais de Conformidade Corporativa
PRIVILEGIOS_SENSIVEIS: Final[set[str]] = {
    "FINANCEIRO_LIQUIDAR",
    "ROOT_ACESSO_BANCO",
    "EXPORTAR_DADOS_LGPD",
    "MODIFICAR_AUDITORIA"
}

PRIVILEGIOS_PADRAO_TI: Final[set[str]] = {
    "CONSULTA_LOGS",
    "REINICIAR_CONTAINER",
    "EXPORTAR_DADOS_LGPD"
}

def auditar_privilegios(usuario: PerfilAcesso) -> dict[str, set[str] | bool]:
    """Analisa a postura de segurança do usuário através de álgebra de conjuntos."""
    privs = usuario.privilegios_ativos

    # Operações de Conjunto em tempo O(1)
    sensiveis_concedidos = privs & PRIVILEGIOS_SENSIVEIS          # Interseção
    privilegios_nao_conformes = sensiveis_concedidos - PRIVILEGIOS_PADRAO_TI # Diferença
    possui_todos_padrao = PRIVILEGIOS_PADRAO_TI <= privs          # Subconjunto

    return {
        "sensiveis_ativos": sensiveis_concedidos,
        "privilegios_excessivos": privilegios_nao_conformes,
        "possui_baseline_completo": possui_todos_padrao,
        "alerta_seguranca": len(privilegios_nao_conformes) > 0
    }

# ==============================================================================
# 3. EXECUÇÃO DEMONSTRATIVA
# ==============================================================================
if __name__ == "__main__":
    print("=" * 80)
    print("      REPOSITÓRIO GENÉRICO E AUDITORIA DE CONJUNTOS (HASH SETS)")
    print("=" * 80)

    # 1. Utilizando o repositório genérico tipado
    repositorio_usuarios: RepositorioGenerico[PerfilAcesso] = RepositorioGenerico()

    u1 = PerfilAcesso("USR-01", "Mariana Costa", "Segurança da Informação", {
        "CONSULTA_LOGS", "REINICIAR_CONTAINER", "EXPORTAR_DADOS_LGPD", "ROOT_ACESSO_BANCO"
    })
    u2 = PerfilAcesso("USR-02", "Lucas Albuquerque", "Suporte N1", {
        "CONSULTA_LOGS"
    })
    u3 = PerfilAcesso("USR-03", "Beatriz Fontes", "Controladoria Financeira", {
        "FINANCEIRO_LIQUIDAR", "EXPORTAR_DADOS_LGPD"
    })

    repositorio_usuarios.inserir(u1.id_usuario, u1)
    repositorio_usuarios.inserir(u2.id_usuario, u2)
    repositorio_usuarios.inserir(u3.id_usuario, u3)

    print(f">> Total de perfis cadastrados no repositório: {len(repositorio_usuarios)}")
    print("-" * 80)

    # 2. Auditoria de Segurança com Álgebra de Sets
    for perfil in repositorio_usuarios:
        parecer = auditar_privilegios(perfil)
        print(f"Colaborador  : {perfil.nome} ({perfil.departamento})")
        print(f"Privilégios  : {perfil.privilegios_ativos}")
        print(f"Críticos (&) : {parecer['sensiveis_ativos']}")
        if parecer["alerta_seguranca"]:
            print(f"  ⚠️ ALERTA : Privilégios fora do padrão de TI: {parecer['privilegios_excessivos']}")
        else:
            print("  🟢 STATUS : Postura de segurança em conformidade.")
        print("-" * 80)

    # 3. Análise Estatística de Privilégios com Counter e defaultdict
    print(">> Histograma de Concessão de Privilégios com Counter:")
    todos_privilegios = [priv for p in repositorio_usuarios for priv in p.privilegios_ativos]
    contador_privs = Counter(todos_privilegios)

    for priv_nome, ocorrencias in contador_privs.most_common():
        print(f"  * {priv_nome:<25} : Concedido a {ocorrencias} usuário(s)")

    # Agrupamento por departamento com defaultdict
    usuarios_por_dept: defaultdict[str, list[str]] = defaultdict(list)
    for p in repositorio_usuarios:
        usuarios_por_dept[p.departamento].append(p.nome)

    print("\n>> Distribuição por Departamento (defaultdict):")
    for dept, nomes in usuarios_por_dept.items():
        print(f"  * {dept:<28} : {', '.join(nomes)}")
    print("=" * 80)