Tela de login: credencial única, sem banco
Toda rota passa por um before_request que redireciona para /login quem não tem sessão — inclusive os POSTs, então /exportar e /salvar-sd sem cookie não chegam ao handler. Ficam de fora só a própria entrada e /static (a tela de login precisa da folha de estilo). Credencial única em constante (admin@iasis.com.br / admin123), comparada com compare_digest nos dois campos e com a mesma mensagem para usuário errado e senha errada — dizer qual dos dois falhou entrega metade da credencial. Sem banco, sem cadastro e sem recuperação de senha: a app é ferramenta interna de uso individual, e isto existe para o upload e o writeback não ficarem abertos a quem alcançar a porta quando ela roda hospedada. SECRET_KEY não tem default assado na imagem — chave fixa numa imagem vale para toda cópia dela. Sem a variável, o servidor sorteia uma por processo e o login cai a cada restart, que é a mesma vida útil que a sessão da SD já tem; é seguro porque o gunicorn roda com -w 1. APP_USUARIO/APP_SENHA seguem a convenção do Dockerfile: default lá, compose só espelha. O Sair encerra a sessão do navegador sem descartar a SD em memória — é a mesma máquina, o mesmo processo. E o teste_e2e faz login uma vez no test client, senão todo request dele voltaria 302. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
{% extends "base.html" %}
|
||||
{% block titulo %}Entrar{% endblock %}
|
||||
|
||||
{# A tela de login fica fora do fluxo enviar → corrigir → exportar: as três
|
||||
etapas do cabeçalho não descrevem nada aqui, então o bloco esvazia. #}
|
||||
{% block estados %}{% endblock %}
|
||||
|
||||
{% block conteudo %}
|
||||
<section class="cartao entrada">
|
||||
<h2>Entrar</h2>
|
||||
<p>Acesso restrito. Informe o e-mail e a senha para usar a exportação da SD.</p>
|
||||
|
||||
<form method="post" action="{{ url_for('entrar') }}">
|
||||
<label>E-mail
|
||||
<input type="email" name="email" value="{{ email }}" placeholder="nome@dominio.com.br"
|
||||
autocomplete="username" autofocus required>
|
||||
</label>
|
||||
<label>Senha
|
||||
<input type="password" name="senha" autocomplete="current-password" required>
|
||||
</label>
|
||||
<div class="acoes">
|
||||
<button type="submit" class="primario">Entrar</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<p class="nota">Credencial única, definida na configuração da aplicação. Não há
|
||||
cadastro de usuário nem recuperação de senha — se a senha se perdeu, ela se
|
||||
troca no ambiente de quem hospeda a app.</p>
|
||||
</section>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user