autenticação - LucasXRosas/utfprarena GitHub Wiki
Esta página aborda cada item da tabela de avaliação da rubrica, seus fundamentos teóricos com citações bibliográficas de livros, demonstração prática, análise de código e testes automatizados.
https://www.youtube.com/watch?v=UA5lF8auVNY
- Contexto de Negócio: O sistema UTFPR Arena gerencia complexos esportivos de Beach Tennis. Em um modelo de negócio de mensalistas, o maior risco financeiro é a inadimplência continuada (atletas utilizando as instalações sem pagar).
- Importância da Autenticação: A autenticação é o ponto de entrada e o mecanismo primordial de identificação inequívoca de cada usuário no sistema. Ela assegura que apenas pessoas registradas transitem entre as camadas da aplicação.
-
Motor de Regras de Inadimplência: O sistema implementa uma "catraca lógica" que monitora as mensalidades. Se um atleta possuir 2 ou mais faturas vencidas, seu status é alterado para
blocked(bloqueado), impedindo agendamentos e uso das quadras de areia. -
Desbloqueio Imediato: Ao quitar suas faturas em aberto, o sistema reativa o atleta em tempo real para
active, eliminando intervenções manuais da secretaria.
O sistema adota o padrão RBAC (Role-Based Access Control) com três níveis de acesso bem delineados:
-
Visitante (Não autenticado):
- Tem acesso unicamente às páginas públicas: Landing Page (
/) e Tela de Login (/login). - Bloqueado sumariamente ao tentar acessar qualquer rota interna.
- Tem acesso unicamente às páginas públicas: Landing Page (
-
Aluno / Atleta (
role: student):- Redirecionado pós-login para a Área do Aluno (
/dashboard). - Ações: Consulta sua credencial de acesso ("Apto para Jogar"), verifica histórico e status de faturas (Pagas/Pendentes) e visualiza a disponibilidade das quadras da arena.
- Tentativa de acesso à área gerencial (
/admin) resulta em bloqueio pelo middleware de autorização (403 Forbiddenou redirecionamento com alerta).
- Redirecionado pós-login para a Área do Aluno (
-
Administrador / Gestor (
role: manager):- Redirecionado pós-login para o Painel Gerencial (
/admin). - Ações: Acompanha métricas globais (total de atletas, número de bloqueados por inadimplência), audita timestamps de login e tem o poder de bloquear ou reativar manualmente o acesso de qualquer atleta à arena.
- Redirecionado pós-login para o Painel Gerencial (
- Conceito: Autenticação é o processo de verificação e validação da identidade alegada por uma entidade (usuário, processo ou dispositivo). Responde formalmente à questão: "Você é realmente quem declara ser?". Baseia-se no confronto entre uma identidade reivindicada (identificador/e-mail) e um fator comprobatório de autenticidade (segredo/senha).
-
Referência Bibliográfica:
STALLINGS, William. Criptografia e Segurança de Redes: Princípios e Práticas. 6. ed. São Paulo: Pearson Education do Brasil, 2014.
Capítulo 1: Introdução à Segurança de Computadores e Redes — Seção 1.2: Conceitos de Segurança de Computadores (Autenticidade e Verificação de Identidade).
-
Conceito:
-
Autenticação (AuthN): Diz respeito à identidade ("Quem é você?"). Exemplo no código:
App\Middleware\Authenticateverifica se o visitante possui uma sessão válida ativa viaLib\Authentication\Auth::check(). -
Autorização (AuthZ): Diz respeito aos privilégios e permissões concedidos àquela identidade ("O que você tem permissão para fazer?"). Exemplo no código:
App\Middleware\AuthorizeAdminverifica se o usuário autenticado possui o papelmanagerpara acessar/admin. Um aluno logado possui autenticação, mas não possui autorização para administrar a arena, recebendo bloqueio (403).
-
Autenticação (AuthN): Diz respeito à identidade ("Quem é você?"). Exemplo no código:
-
Referência Bibliográfica:
TANENBAUM, Andrew S.; WETHERALL, David. Redes de Computadores. 5. ed. São Paulo: Pearson, 2011.
Capítulo 8: Segurança de Redes — Seção 8.6: Controle de Acesso e Políticas de Autorização.
-
Conceito: O protocolo HTTP é nativamente stateless (sem estado): cada requisição é tratada isoladamente sem vínculo com as anteriores. Para manter o estado de usuário logado:
-
Sessão (Server-Side): Ao autenticar com sucesso, o servidor PHP aloca memória/arquivo para armazenar as variáveis de sessão (
$_SESSION['user']['id'] = $id) e gera um identificador pseudoaleatório criptograficamente forte (Session ID, ex:PHPSESSID). -
Cookie (Client-Side): O servidor devolve no cabeçalho HTTP a instrução
Set-Cookie: PHPSESSID=...; Path=/; HttpOnly; SameSite=Lax. -
Ciclo de Requisições: O navegador armazena esse cookie e o retransmite automaticamente em todas as requisições subsequentes no cabeçalho
Cookie: PHPSESSID=.... - O servidor correlaciona o
PHPSESSIDaos dados guardados em memória e restaura o usuário logado viaAuth::user().
-
Sessão (Server-Side): Ao autenticar com sucesso, o servidor PHP aloca memória/arquivo para armazenar as variáveis de sessão (
-
Referência Bibliográfica:
KUROSE, James F.; ROSS, Keith W. Redes de Computadores e a Internet: Uma Abordagem Top-Down. 7. ed. São Paulo: Pearson, 2017.
Capítulo 2: Camada de Aplicação — Seção 2.2.4: Interação Usuário-Servidor: Cookies e Gerenciamento de Sessão.
| Critério de Comparação | Autenticação por Cookies/Sessões (Stateful) | JWT - JSON Web Tokens (Stateless) | HTTP Basic / Digest Authentication |
|---|---|---|---|
| Armazenamento de Estado | No servidor (memória, disco ou Redis). O cliente só guarda o token de sessão. | No cliente (no próprio corpo do token assinado criptograficamente). | Sem estado. O cliente reenvia credenciais (login:senha) em base64 a cada request. |
| Revogação de Acesso | Imediata: apagar a sessão no servidor encerra o acesso no mesmo instante. |
Complexa: o token permanece válido até expirar (exp), exigindo listas de revogação/blacklist. |
Difícil sem alteração da senha cadastrada no servidor. |
| Segurança contra Roubo (XSS) | Alta, se o cookie utilizar a flag HttpOnly (inacessível via scripts JS). |
Baixa se guardado em localStorage (vulnerável a ataques XSS). |
As credenciais trafegam codificadas em base64 (requer HTTPS obrigatório). |
| Escalabilidade Horizontal | Requer sessões compartilhadas (Redis/Sticky Sessions) em clusters. | Nativa para arquiteturas de microsserviços e APIs distribuídas. | Simples, porém antiquada para interfaces modernas ricas. |
-
Referência Bibliográfica:
LOCKHART, Josh. PHP Moderno: Recursos Modernos e Boas Práticas. São Paulo: Novatec Editora, 2016.
Capítulo 5: Boas Práticas — Seção: Autenticação de Usuários, Cookies Seguros e Tokens de API.
- Conceito: O Middleware aplica o padrão de projeto Chain of Responsibility (Cadeia de Responsabilidades) e Intercepting Filter. Ele atua como uma barreira que intercepta o ciclo de vida da requisição HTTP antes que ela atinja o método do Controller. Isso garante o princípio DRY (Don't Repeat Yourself): os controladores não precisam duplicar checagens manuais de autenticação. Se a condição falhar, o middleware interrompe o fluxo (redirecionando ou emitindo código 401); se for válida, permite a continuidade da execução.
-
Referência Bibliográfica:
GAMMA, Erich; HELM, Richard; JOHNSON, Ralph; VLISSIDES, John. Padrões de Projeto: Soluções Reutilizáveis de Software Orientado a Objetos (GoF). Porto Alegre: Bookman, 2000.
Padrões Comportamentais: Chain of Responsibility (Cadeia de Responsabilidades).
(Ou alternativamente: FOWLER, Martin. Padrões de Arquitetura de Aplicações Corporativas. Bookman, 2006 — Intercepting Filter).
- Autenticação Federada / SSO (Single Sign-On): Utilização de provedores de identidade externos com protocolos OAuth 2.0 e OpenID Connect (ex: "Entrar com Google", "Entrar com Microsoft"). O sistema não conhece a senha do usuário.
- Passwordless (Magic Links e OTP via E-mail/SMS/WhatsApp): O usuário informa seu identificador e recebe um link de acesso ou código numérico de uso único (One-Time Password) com expiração de poucos minutos.
- Biometria e WebAuthn / FIDO2 (Passkeys): Autenticação sem senha baseada em criptografia de chave pública através do leitor de impressão digital, reconhecimento facial (TouchID/FaceID) ou chaves físicas de hardware (YubiKey).
- Certificados Digitais (mTLS / ICP-Brasil): Utiliza infraestrutura de chaves públicas com certificados digitais X.509 em tokens criptográficos A1/A3.
-
Referência Bibliográfica:
STALLINGS, William. Criptografia e Segurança de Redes: Princípios e Práticas. 6. ed. Pearson, 2014.
Capítulo 17: Autenticação de Usuários e Infraestrutura de Chave Pública (PKI).
-
Conceito: A Autenticação de Dois Fatores baseia-se no princípio de que a autenticidade deve ser comprovada combinando fatores de pelo menos duas categorias distintas:
- Algo que você sabe: Senha estática ou PIN.
- Algo que você possui: Smartphone gerando tokens temporários (TOTP via Google Authenticator), token USB de segurança.
- Algo que você é: Biometria física (impressão digital, íris, geometria facial).
- Importância: Elimina a vulnerabilidade de senhas comprometidas. Mesmo que um atacante obtenha a senha do usuário através de phishing, vazamento de banco de dados ou força bruta, ele não conseguirá invadir a conta, pois não possui a posse física do dispositivo gerador do segundo fator em tempo real.
-
Referência Bibliográfica:
ANDERSON, Ross. Engenharia de Segurança: Um Guia para a Construção de Sistemas Distribuídos Confiáveis. 2. ed. Porto Alegre: Bookman, 2008.
Capítulo 2: Usabilidade e Psicologia — Seção 2.4: Autenticação Multifator e Tokens de Senha Única.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(191) NOT NULL,
encrypted_password VARCHAR(255) NOT NULL,
avatar_name VARCHAR(65) NULL,
phone VARCHAR(20) NULL,
cpf VARCHAR(14) NULL,
role VARCHAR(30) NOT NULL DEFAULT 'student',
status VARCHAR(30) NOT NULL DEFAULT 'active',
remember_token VARCHAR(100) NULL,
last_login_at DATETIME NULL,
email_verified_at DATETIME NULL,
password_reset_token VARCHAR(100) NULL,
password_reset_expires_at DATETIME NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uq_users_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;-
Hash de Senha Seguro com BCrypt (
encrypted_password):- Senhas em texto puro nunca são persistidas no banco.
- O campo armazena hashes gerados por
password_hash($value, PASSWORD_DEFAULT)(algoritmo BCrypt, tamanho de 60 a 255 caracteres). - O BCrypt embute automaticamente um Salt criptográfico de 128 bits aleatório a cada geração, inviabilizando ataques pré-computados com tabelas Rainbow.
- Possui fator de custo adaptativo (cost factor), tornando propositalmente lentos ataques de força bruta automatizados.
-
Campos para Recuperação Segura de Senha:
-
password_reset_token: Armazena um token criptográfico pseudoaleatório de uso único gerado no momento do pedido de redefinição. -
password_reset_expires_at: Delimita uma janela curta de validade (ex: 30 minutos). Após expirado, o token é descartado, evitando ataques de repetição (replay attack).
-
-
Auditoria e Monitoramento de Login:
-
last_login_at: Registra o exato timestamp de cada login bem-sucedido, possibilitando auditoria de acessos anômalos e identificação de contas inativas. -
email_verified_at: Confirma a posse do e-mail do titular antes de habilitar permissões privilegiadas ou envio de credenciais.
-
- Usuário digita
GET /dashboard. - O Front Controller
public/index.phpincluiconfig/bootstrap.php, disparandoRouter::init(). - O arquivo
config/routes.phpregistrou/dashboarddentro do grupoRoute::middleware('auth')->group(...). - O
Router::dispatch()encontra o casamento de rota e executa os middlewares da rota chamando$route->runMiddlewares($request). - O
App\Middleware\Authenticate::handle($request)verifica seLib\Authentication\Auth::check()é verdadeiro. - Como
$_SESSION['user']['id']não existe, o middleware detecta a ausência de autenticação:- Grava a mensagem efêmera:
FlashMessage::danger('Você deve estar logado para acessar essa página');. - Executa
header('Location: ' . route('users.login')); exit;.
- Grava a mensagem efêmera:
- O
DashboardControllernunca é instanciado, assegurando isolamento absoluto.
- Formulário em
/loginsubmetePOST /logincomuser[email]euser[password]. - O roteador despacha para
App\Controllers\AuthController::create($request). - O controlador busca o usuário:
$user = User::findByEmail($email). - Se o usuário não existe ou se
$user->authenticate($password)retornarfalse(viapassword_verify($password, $user->encrypted_password)): - O controlador grava:
FlashMessage::danger('Email ou senha inválidos');e executa$this->redirectTo(route('users.login')). - Nenhuma sessão é inicializada. O navegador recarrega
/logincom a mensagem flash de perigo.
- Usuário informa credenciais válidas (
[email protected]/admin123ou[email protected]/aluno123). -
password_verify()retornatrue. - O controlador checa se
$user->isBlocked(). Se bloqueado por inadimplência, recusa com aviso. - Se regular, atualiza
$user->last_login_at = date('Y-m-d H:i:s'); $user->save();. - O método
Lib\Authentication\Auth::login($user)é invocado:- Executa
session_regenerate_id(true);para proteger contra fixação de sessão. - Salva o ID do usuário:
$_SESSION['user']['id'] = $user->id;.
- Executa
- Define mensagem flash de sucesso:
FlashMessage::success('Autenticação bem-sucedida!...'). - Redirecionamento baseado no papel (RBAC):
- Se
$user->isAdmin(): redireciona para/admin. - Caso contrário: redireciona para
/dashboard.
- Se
- Usuário clica no botão "Sair", submetendo
POST /logout. - O roteador despacha para
AuthController::destroy($request). - Invoca
Lib\Authentication\Auth::logout():- Executa
unset($_SESSION['user']['id']);eunset($_SESSION['user']);. - Invoca
session_destroy()para eliminar os dados persistidos no servidor.
- Executa
- Grava
FlashMessage::success('Logout realizado com sucesso. Sessão encerrada com segurança.');. - Redireciona para
route('users.login').
-
Origem e Arquitetura:
- O método estático
Route::middleware(string $name)emcore/Router/Route.phpinstancia um objetoCore\Router\RouteWrapperMiddleware($name). - O
RouteWrapperMiddlewareimplementa o padrão Wrapper/Decorator:public function group(callable $callback): void { $routeSizeBefore = Router::getInstance()->getRouteSize(); $callback(); // Executa o bloco de rotas internas $routeSizeAfter = Router::getInstance()->getRouteSize(); for ($i = $routeSizeBefore; $i < $routeSizeAfter; $i++) { $route = Router::getInstance()->getRoute($i); $route->addMiddleware($this->middlewareInstance()); } }
- Ele anota a contagem de rotas no singleton
Routerantes de rodar a closure. Durante o$callback(), novas instâncias deRoutesão registradas. - Ao terminar a closure, todas as rotas criadas naquele intervalo recebem a injeção do middleware correspondente mapeado no array
Config\App::$middlewareAliases['auth']. - Na hora da requisição, em
Router::dispatch(),$route->runMiddlewares($request)executa a cadeia de middlewares antes de qualquer chamada ao controlador.
- O método estático
-
Padrão PRG (Post/Redirect/Get):
- O componente resolve o problema clássico de repetição de mensagens ou reenvio de formulários acidentais via F5.
-
Funcionamento:
-
FlashMessage::danger($msg)grava em$_SESSION['flash']['danger'] = $msg;. -
FlashMessage::success($msg)grava em$_SESSION['flash']['success'] = $msg;. - No layout
app/views/layouts/_flash_message.phtml, o métodoFlashMessage::get()lê as mensagens salvas e imediatamente executaunset($_SESSION['flash']):public static function get(): array { $flash = $_SESSION['flash'] ?? []; unset($_SESSION['flash']); // Destroi imediatamente após a leitura return $flash; }
- Como é destruída logo após a primeira renderização, se o usuário atualizar a página (F5), a mensagem já não existe mais.
-
Executados via Codeception com Selenium WebDriver (./run test:browser):
-
tentativaDeAcessoAreaRestritaSemAutenticacao: Acessa/dashboarddeslogado e valida que foi redirecionado para/logincom a mensagem flash correta. -
tentativaDeAutenticacaoComDadosIncorretos: Preenche e-mail e senha inválidos e valida permanência em/logincom aviso de erro. -
autenticacaoBemSucedidaAdmin: Preenche dados de admin e valida redirecionamento para/admine texto "Painel Gerencial". -
autenticacaoBemSucedidaAluno: Preenche dados de aluno e valida redirecionamento para/dashboarde texto "Área do Aluno". -
logout: Realiza login, clica em "Sair" e valida encerramento da sessão e tela de login.
Executados via Guzzle HTTP Client (./run test tests/Integration/Access):
-
Rotas Públicas (
PublicRoutesAccessTest.php):-
test_should_access_home_route: RequisiçãoGET /retorna status200 OK. -
test_should_access_login_route: RequisiçãoGET /loginretorna status200 OK.
-
-
Rotas Autenticadas (
AuthenticatedRoutesAccessTest.php):-
test_should_redirect_unauthenticated_user_from_dashboard:GET /dashboardretorna status302 Founde cabeçalhoLocation: /login. -
test_should_redirect_unauthenticated_user_from_admin:GET /adminretorna status302 Founde redireciona. -
test_should_return_401_for_unauthenticated_json_request: Requisição com cabeçalhoAccept: application/jsonretorna código401 Unauthorized.
-
Executados via PHPUnit (./run test tests/Unit):
-
Métodos do Model (
tests/Unit/Models/Users/UserTest.php):- Testes de validação: campos obrigatórios não vazios, e-mail único, confirmação de senha.
- Testes de CRUD no ActiveRecord:
save(),all(),findById(),findByEmail(),destroy(). - Testes de autenticação e hash:
authenticate('123456') === truee senhas incorretas retornandofalse. - Métodos de regras de negócio da arena:
isAdmin(),isStudent(),isActive(),isBlocked(),block()eactivate().
-
Classes de Suporte:
-
tests/Unit/Lib/Authentication/AuthTest.php: métodoslogin(),user(),check()elogout(). -
tests/Unit/Lib/FlashMessageTest.php: métodossuccess(),danger()e auto-destruição noget(). -
tests/Unit/Core/Router/: testes de correspondência de rotas, parâmetros dinâmicos e encadeamento de grupos de middleware.
-
feat(auth): implementar autenticação, controle de papéis (RBAC), segurança e testes automatizados
feature/auth-rbac-and-security
chore: sincronizar projeto com o framework template tsi34d-framework-templatefeat(db): configurar schema MySQL com tabela users, faturas e quadras de beach tennisfeat(auth): implementar controle de sessao, AuthController e middlewares auth e adminfeat(views): criar layouts responsivos para login, dashboard do atleta e painel gerencialtest(unit): adicionar testes unitarios de modelos, autenticacao e flash messagestest(integration): adicionar testes de acesso para rotas publicas e autenticadastest(acceptance): criar testes end-to-end no Codeception para os fluxos da rubricadocs: atualizar README e documentacao completa de defesa da rubrica
## Descrição da Pull Request
Esta PR implementa o módulo completo de Autenticação, Autorização e Segurança do sistema UTFPR Arena, em conformidade total com a arquitetura `tsi34d-framework-template` e os critérios da rubrica de avaliação.
### O que foi implementado:
1. **Adequação ao Framework Template:**
- Estrutura de diretórios `app/`, `core/`, `lib/`, `config/`, `database/`, `tests/` e runner `./run`.
- Containerização com Nginx, PHP 8.3 FPM, MySQL 8.4 e Selenium.
2. **Autenticação e Sessões Seguras:**
- Hashing de senha com algoritmo BCrypt (`password_hash` / `password_verify`).
- Mitigação de *Session Fixation* via `session_regenerate_id(true)`.
- Sistema de mensagens efêmeras com `Lib\FlashMessage` (padrão PRG).
3. **Controle de Acesso Baseado em Papéis (RBAC):**
- Agrupamento de rotas com `Route::middleware('auth')->group(...)`.
- Middleware especializado de administrador (`admin`) para restrição de rotas do painel gerencial.
4. **Banco de Dados e Requisitos de Segurança:**
- Tabela `users` com colunas de auditoria (`last_login_at`, `email_verified_at`) e recuperação de senha (`password_reset_token`, `password_reset_expires_at`).
- Script `database/Populate/populate.php` com sementes para Administrador, Aluno Ativo e Aluno Bloqueado.
5. **Testes Automatizados:**
- 100% de aprovação nos testes unitários (`./run test tests/Unit`).
- Testes de integração de rotas públicas e autenticadas (`./run test tests/Integration`).
- Testes de aceitação cobrindo os 4 fluxos no Codeception (`./run test:browser`).
6. **Qualidade e CI:**
- Conformidade PSR-12 validada no `phpcs`.
- Análise estática nível 6 com zero erros no `phpstan`.-
Middleware de Autorização por Papel (RBAC Aninhado):
- Criação do middleware
App\Middleware\AuthorizeAdminintegrado à fluent API do Router, permitindo aninhamento elegante:Route::middleware('auth')->group(function() { Route::middleware('admin')->group(...) }).
- Criação do middleware
-
Suporte Híbrido Web & REST API nos Middlewares:
- Os middlewares detectam requisições de API via cabeçalho
Accept: application/jsone respondem automaticamente com códigos HTTP canônicos (401 Unauthorizede403 Forbidden) em JSON, mantendo o redirecionamento comFlashMessagepara navegadores tradicionais.
- Os middlewares detectam requisições de API via cabeçalho
-
Auditoria e Monitoramento de Login em Tempo Real:
- Atualização automática de
last_login_atno banco a cada login bem-sucedido.
- Atualização automática de
Esta seção documenta de forma transparente o uso de ferramentas de Inteligência Artificial Generativa (IA) como copiloto no processo de concepção, arquitetura, codificação e documentação deste módulo de Autenticação e Controle de Acesso.
- Gemini (Google): Utilizado para refinamento arquitetural, modelagem de regras de negócio complexas, geração de casos de teste automatizados e revisão da fundamentação teórica.
- Antigravity-IDE (Google): Utilizados diretamente na IDE para autocompletar trechos de código e acelerar a escrita dos Middlewares e Controllers da aplicação.
As IAs foram integradas ao ciclo de desenvolvimento com os seguintes objetivos:
- Validação Arquitetural: Garantir que o padrão Chain of Responsibility fosse implementado de forma idiomática na camada de Middlewares do PHP.
- Modelagem da Regra de Inadimplência: Auxiliar no design lógico da "catraca virtual" (mecanismo que bloqueia o usuário caso ele possua 2 ou mais faturas vencidas).
- Pesquisa e Levantamento Bibliográfico: Mapeamento de autores clássicos da computação e segurança (como Stallings, Tanenbaum e Kurose) para fundamentar teoricamente os conceitos de AuthN e AuthZ.
- Escrita de Testes: Acelerar a criação de dados fictícios (Mocks) e cenários de testes de integração com o PHPUnit.
-
Prompt Enviado:
"Atue como um arquiteto de software sênior especialista em PHP. Preciso criar um middleware para o sistema UTFPR Arena (gerenciamento de Beach Tennis). O sistema usa RBAC e sessões. Se o usuário estiver logado com a role 'student', preciso que o middleware verifique no banco se ele tem 2 ou mais faturas vencidas. Se tiver, altere o status dele na sessão para 'blocked' e bloqueie o acesso a qualquer rota interna, permitindo apenas que ele veja o dashboard com o aviso de pagamento. Como posso estruturar essa lógica de interceptação respeitando o princípio DRY?"
-
Resultado Obtido:
A IA gerou a estrutura conceitual do
InadimplenciaMiddleware, sugerindo a verificação logo após o middleware de autenticação global. O código sugerido pela IA isolou a consulta de faturas em um serviço específico (FaturamentoService::possuiInadimplenciaCritica($userId)), o que evitou poluir o middleware com consultas SQL diretas e garantiu uma separação clara de responsabilidades.
-
Prompt Enviado:
"Preciso documentar academicamente a diferença entre Autenticação (AuthN) e Autorização (AuthZ). Quais são os livros clássicos de redes ou segurança da informação em português que explicam de forma clara essa separação? Formate no padrão ABNT com foco em controle de acesso ou segurança."
- Resultado Obtido: A IA forneceu as referências estruturadas de William Stallings (Criptografia e Segurança de Redes) e Andrew S. Tanenbaum (Redes de Computadores), indicando exatamente quais capítulos e seções tratavam de autenticidade, políticas de autorização e o conceito de controle de acesso baseado em papéis (RBAC). Isso ajudou a consolidar a seção 2 do documento com rigor acadêmico.