feat: item 14 do roadmap -- identidade via Authentik (forward-auth) e audit log #66

Merged
jhony75 merged 2 commits from feature/audit-log-authentik into develop 2026-09-11 03:18:37 -03:00
Owner

Item 14 do roadmap: identidade real (autoria) + histórico de mudança de status/severidade, usando o Authentik já disponibilizado como forward-auth.

Correção de nomenclatura: quase toda a documentação anterior (docs/adr/0004-*, docs/HANDOFF.md, docs/BACKLOG.md, docs/API.md) citava "Authelia" como o mecanismo planejado -- era um erro de nomenclatura desde o início, não uma mudança de plano. O produto real disponibilizado é o Authentik. Corrigido em todos os arquivos; ver ADR-0014 para a decisão completa.

Decisões confirmadas com o usuário:

  • Authentik como forward-auth (Proxy Provider/outpost no Traefik), não OIDC direto no app.
  • Escopo: autoria (quem fez) e histórico de mudança de status/severidade, juntos.
  • Report.reviewer/Report.approved_by/TestRun.executed_by deixam de ser texto livre -- viram auto-preenchidos a partir da identidade capturada (nunca aceitos do payload do cliente).
  • Headers confiados (confirmados na config real do middleware forwardauth): X-authentik-username, X-authentik-email, X-authentik-groups (|-separado), X-authentik-uid.
  • Fallback de dev (DEV_FAKE_USER, só com ENVIRONMENT=development) com trava de segurança: derruba o boot se DEV_FAKE_USER estiver setado junto de ENVIRONMENT=production.
  • Header ausente fora de dev (infra ainda não plugada pro eeg-qa): captura fica null, nada quebra -- rollout aditivo.

Implementado:

  • backend/services/identity.py -- get_current_user (dependency FastAPI) + assert_dev_fallback_not_misconfigured (chamada no boot, main.py).
  • backend/modules/audit_log/ (novo) -- tabela genérica AuditLogEntry (entity_type/entity_id/field/old_value/new_value/changed_by/changed_at), record_change(), GET /api/audit-log?entity_type=&entity_id=. Migration d09a77ddaa17.
  • Wired em update_report (Report.status), update_issue (Issue.status e Issue.severity) e update_run/create_run (TestRun.status, dispara executed_by); reviewer/approved_by disparam quando review_date/approved_at são setados/limpos.
  • Frontend: ReportForm/ReportDetail/RunForm/RunDetail perdem os inputs de texto de autoria, viram campo read-only ou ReadField, com dica explicando o auto-preenchimento.

Pendente (infra, fora deste repo, responsabilidade do usuário): adicionar authentik-forwardauth@docker no router eegqa-api do Traefik + criar Provider/Application no Authentik.

Verificação: 248 testes de backend (18 novos), 152 de frontend, typecheck/lint/build/Storybook build OK, walkthrough manual no browser real (Report e Run) confirmando auto-preenchimento e o novo endpoint de audit log.

Item 14 do roadmap: identidade real (autoria) + histórico de mudança de status/severidade, usando o Authentik já disponibilizado como forward-auth. **Correção de nomenclatura**: quase toda a documentação anterior (`docs/adr/0004-*`, `docs/HANDOFF.md`, `docs/BACKLOG.md`, `docs/API.md`) citava "Authelia" como o mecanismo planejado -- era um erro de nomenclatura desde o início, não uma mudança de plano. O produto real disponibilizado é o Authentik. Corrigido em todos os arquivos; ver [ADR-0014](../src/branch/develop/docs/adr/0014-identidade-authentik-forward-auth-e-audit-log.md) para a decisão completa. **Decisões confirmadas com o usuário:** - Authentik como forward-auth (Proxy Provider/outpost no Traefik), não OIDC direto no app. - Escopo: autoria (quem fez) e histórico de mudança de status/severidade, juntos. - `Report.reviewer`/`Report.approved_by`/`TestRun.executed_by` deixam de ser texto livre -- viram auto-preenchidos a partir da identidade capturada (nunca aceitos do payload do cliente). - Headers confiados (confirmados na config real do middleware `forwardauth`): `X-authentik-username`, `X-authentik-email`, `X-authentik-groups` (`|`-separado), `X-authentik-uid`. - Fallback de dev (`DEV_FAKE_USER`, só com `ENVIRONMENT=development`) com trava de segurança: derruba o boot se `DEV_FAKE_USER` estiver setado junto de `ENVIRONMENT=production`. - Header ausente fora de dev (infra ainda não plugada pro eeg-qa): captura fica `null`, nada quebra -- rollout aditivo. **Implementado:** - `backend/services/identity.py` -- `get_current_user` (dependency FastAPI) + `assert_dev_fallback_not_misconfigured` (chamada no boot, `main.py`). - `backend/modules/audit_log/` (novo) -- tabela genérica `AuditLogEntry` (entity_type/entity_id/field/old_value/new_value/changed_by/changed_at), `record_change()`, `GET /api/audit-log?entity_type=&entity_id=`. Migration `d09a77ddaa17`. - Wired em `update_report` (Report.status), `update_issue` (Issue.status e Issue.severity) e `update_run`/`create_run` (TestRun.status, dispara `executed_by`); `reviewer`/`approved_by` disparam quando `review_date`/`approved_at` são setados/limpos. - Frontend: `ReportForm`/`ReportDetail`/`RunForm`/`RunDetail` perdem os inputs de texto de autoria, viram campo read-only ou `ReadField`, com dica explicando o auto-preenchimento. **Pendente (infra, fora deste repo, responsabilidade do usuário):** adicionar `authentik-forwardauth@docker` no router `eegqa-api` do Traefik + criar Provider/Application no Authentik. **Verificação**: 248 testes de backend (18 novos), 152 de frontend, typecheck/lint/build/Storybook build OK, walkthrough manual no browser real (Report e Run) confirmando auto-preenchimento e o novo endpoint de audit log.
feat: item 14 do roadmap -- identidade via Authentik (forward-auth) e audit log
Some checks failed
EEG QA CI / Detectar o que mudou (pull_request) Successful in 12s
EEG QA CI / Frontend (pull_request) Successful in 2m56s
EEG QA CI / Build e publicação de imagens (pull_request) Has been skipped
EEG QA CI / Deploy development (pull_request) Has been skipped
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Backend (pull_request) Failing after 1m30s
5f12bba72b
Backend le identidade via headers X-authentik-* (forward-auth no Traefik,
services/identity.py), com fallback de dev (DEV_FAKE_USER) que se recusa a
funcionar se ENVIRONMENT=production por engano. Report.reviewer/approved_by e
TestRun.executed_by deixam de aceitar texto livre e passam a ser
auto-preenchidos a partir da identidade capturada. Novo modules/audit_log/
registra historico de mudanca de Report.status, Issue.status/severity e
TestRun.status (GET /api/audit-log). Infra do lado do Authentik/Traefik ainda
depende de um passo fora deste repo -- ver ADR-0014.

Corrige tambem uma imprecisao de nomenclatura que já existia em varios docs
("Authelia" em vez de "Authentik" como mecanismo de auth planejado).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
fix: atualiza expect-alembic do restore drill para a migration da auditoria
All checks were successful
EEG QA CI / Detectar o que mudou (pull_request) Successful in 9s
EEG QA CI / Backend (pull_request) Successful in 1m43s
EEG QA CI / Frontend (pull_request) Successful in 3m18s
EEG QA CI / Build e publicação de imagens (pull_request) Successful in 2m7s
EEG QA CI / Deploy development (pull_request) Has been skipped
EEG QA CI / Deploy production (pull_request) Has been skipped
b79f4434ea
O drill de restore do CI trava a versao esperada do Alembic head num
argumento hardcoded -- esqueci de atualizar ao adicionar a migration
d09a77ddaa17 (audit_log_entries), o que quebrou o job Backend na PR #66.
Confirmado localmente que o drill passa (37 tabelas) com o valor corrigido.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
jhony75 merged commit 361bb6260a into develop 2026-09-11 03:18:37 -03:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jhony75/eeg-qa!66
No description provided.