diff --git a/README.md b/README.md index 8c1e8a8..05077b5 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,33 @@ Proteções: login HTTP Basic em toda rota, CSRF via cookie de duplo envio (`app A rota `/log` mostra o histórico de ações do painel (tabela `LOG_PAINEL`, criada no banco de dev — **precisa ser criada manualmente em produção também**, DDL no início de `app/db/log.py`) e, se `N8N_API_URL`/`N8N_API_KEY` estiverem configuradas (`.env.example`), os últimos envios automáticos de chave via WhatsApp (lidos da Data Table `pagamentos_processados` do n8n, somente leitura). -## Login por funcionário +## Login e permissões -Cada funcionário pode ter seu próprio usuário/senha (tabela `FUNCIONARIO_PAINEL`, criada no banco de dev — **precisa ser criada manualmente em produção também**, DDL no início de `app/db/funcionarios.py`; senha em hash `scrypt`, nunca texto puro). Gerencie em **Funcionários** no menu. +O painel usa login por sessão (cookie assinado, `app/session.py`) — não é +mais HTTP Basic Auth. Defina `SESSION_SECRET` no `.env` (`.env.example` +tem o exemplo); sem isso, uma chave é gerada em memória a cada start do +processo, o que derruba todas as sessões ativas a cada restart (funciona, +só incomoda). -`ADMIN_USER`/`ADMIN_PASSWORD` (`.env.example`) continuam funcionando como conta de bootstrap — é com ela que você entra a primeira vez para cadastrar o primeiro funcionário, e serve de plano B se a tabela ficar vazia. Login checa primeiro o admin do `.env`, depois `FUNCIONARIO_PAINEL` (só contas com `ATIVO=1`). O log de ações mostra o nome de quem fez cada coisa. +Cada funcionário (`FUNCIONARIO_PAINEL`, criada no banco de dev — **precisa +ser criada manualmente em produção também**, DDL no início de +`app/db/funcionarios.py`) tem um perfil: **admin** (gerencia outros +funcionários em `/funcionarios`: cadastra, edita, redefine senha, +ativa/desativa, promove/rebaixa perfil) ou **padrão** (sem acesso a +`/funcionarios`). Todo funcionário cadastrado antes dessa funcionalidade +existir virou admin automaticamente na migração (`ALTER TABLE +FUNCIONARIO_PAINEL ADD COLUMN PERFIL ...`, mesmo arquivo). O sistema nunca +deixa ficar sem nenhum admin ativo — rebaixar ou desativar o último admin é +bloqueado. + +Qualquer usuário logado troca a própria senha em **Minha conta** +(`/minha-conta`), pedindo a senha atual antes de trocar. + +`ADMIN_USER`/`ADMIN_PASSWORD` (`.env.example`) continuam funcionando como +conta de bootstrap, sempre com perfil admin — é com ela que você entra a +primeira vez para cadastrar o primeiro funcionário, e serve de plano B se +a tabela ficar vazia. Login checa primeiro o admin do `.env`, depois +`FUNCIONARIO_PAINEL` (só contas com `ATIVO=1`). ## Rodando localmente (sem Docker)