feat(auth): «Manter sessão iniciada» (auditoria: item Médio)
config/functions_remember.php reimplementa o desenho selector/validator do platform-tools (functions_remember.php) localmente, porque esta app tem autenticação própria e não passa por functions_auth.php partilhado: selector em claro e UNIQUE indexa a linha, só o SHA-256 do validator fica na BD, hash_equals() na comparação, rotação a cada uso, e um validator que não bate certo revoga TODOS os tokens da conta (sinal de cookie em circulação). - Checkbox no login; remember_issue() só quando marcada. - require_login() tenta remember_resume() antes de mandar para o login. - logout.php apaga só o token deste browser (não a conta toda). - auth_set_password() revoga todos os tokens da conta — uma password nova não pode deixar um cookie antigo continuar a entrar. Migração: database/migration_20260925_remember_me.sql (remember_tokens). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ee30e6f116
commit
300655b92a
7 files changed
+188
No files matched your search
@@ -57,6 +57,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$user = auth_login($pdo, $_POST['email'] ?? '', $_POST['password'] ?? '');
|
||||
if ($user) {
|
||||
auth_set_session($user);
|
||||
if (!empty($_POST['remember'])) {
|
||||
remember_issue($pdo, (int) $user['id']);
|
||||
}
|
||||
audit('auth.login', ['target_type' => 'user', 'target_id' => (int) $user['id'], 'target_label' => (string) $user['name']]);
|
||||
header('Location: ' . base_url($destination($user['role'])));
|
||||
exit;
|
||||
@@ -122,6 +125,10 @@ include __DIR__ . '/../../includes/auth_header.php';
|
||||
<a href="<?= htmlspecialchars(base_url('views/auth/forgot_password.php')) ?>" class="small">Esqueceu a <span class="text-nowrap">palavra-passe</span>?</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" class="form-check-input" id="login-remember" name="remember" value="1">
|
||||
<label class="form-check-label small" for="login-remember">Manter sessão iniciada</label>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary w-100">Entrar</button>
|
||||
</form>
|
||||
|
||||
|
||||
@@ -7,7 +7,12 @@ require __DIR__ . '/../../config/functions.php';
|
||||
|
||||
if (!empty($_SESSION['user_id'])) {
|
||||
audit('auth.logout', ['target_type' => 'user', 'target_id' => (int) $_SESSION['user_id']]);
|
||||
// Só o token deste browser, não toda a conta: sair aqui não deve expulsar
|
||||
// a pessoa de outro dispositivo onde pediu para ficar.
|
||||
$cookie = remember_parse_cookie();
|
||||
if ($cookie !== null) remember_delete($pdo, $cookie['selector']);
|
||||
}
|
||||
remember_forget_cookie();
|
||||
$_SESSION = [];
|
||||
// Drop the cookie too, so the browser doesn't keep presenting a dead id.
|
||||
if (ini_get('session.use_cookies')) {
|
||||
|
||||
Reference in new issue
Block a user