Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ services:
- ./sql/schema.sql:/docker-entrypoint-initdb.d/01_schema.sql
- ./sql/schema_auth.sql:/docker-entrypoint-initdb.d/02_schema_auth.sql
ports:
- "3307:3306"
- "3308:3306"
networks:
- prodmais
healthcheck:
Expand All @@ -34,7 +34,7 @@ services:
PMA_PORT: 3306
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASS:-root}
ports:
- "8081:80"
- "8082:80"
depends_on:
- db
networks:
Expand Down Expand Up @@ -82,7 +82,7 @@ services:
container_name: prodmais_web
restart: always
ports:
- "8080:80"
- "8090:80"
volumes:
- .:/var/www/html
- /var/www/html/vendor
Expand Down
46 changes: 38 additions & 8 deletions public/login.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,46 @@
session_start();
}

$error = '';
// Redirecionar se já autenticado
if (!empty($_SESSION['user_id'])) {
$papel_atual = $_SESSION['papel'] ?? '';
$dest_already = in_array($papel_atual, ['admin', 'pesquisador']) ? '/admin.php' : '/dashboard.php';
header('Location: ' . $dest_already);
exit;
}

require_once __DIR__ . '/../src/Domain/Security/AuthManager.php';

$error = '';
$success = '';

// Lógica de Autenticação (Exemplo simplificado)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$user = $_POST['user'] ?? '';
$pass = $_POST['password'] ?? '';

// Aqui viria a chamada ao AuthManager
$error = 'Credenciais incorretas para demonstração.';
$username = filter_input(INPUT_POST, 'user', FILTER_SANITIZE_SPECIAL_CHARS) ?? '';
$password = $_POST['password'] ?? '';

$host = getenv('MYSQL_HOST') ?: 'db';
$db_name = getenv('MYSQL_DB') ?: 'prodmais_umc';
$db_user = getenv('MYSQL_USER') ?: 'prodmais';
$db_pass = getenv('MYSQL_PASS') ?: 'prodmais123';

try {
$pdo = new PDO("mysql:host=$host;dbname=$db_name;charset=utf8mb4", $db_user, $db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$auth = new AuthManager($pdo);
$result = $auth->login($username, $password);

if ($result['sucesso']) {
$destino = in_array($_SESSION['papel'] ?? '', ['admin', 'pesquisador']) ? '/admin.php' : '/dashboard.php';
header('Location: ' . $destino);
exit;
}

$error = $result['mensagem'];
} catch (PDOException $e) {
error_log('Login DB error: ' . $e->getMessage());
$error = 'Erro de conexão com o banco de dados. Tente novamente.';
}
}

// Renderizar a página usando o Componente Modular
LoginPage::display(['error' => $error]);
12 changes: 12 additions & 0 deletions public/logout.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
$_SESSION = [];
if (ini_get('session.use_cookies')) {
$p = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000, $p['path'], $p['domain'], $p['secure'], $p['httponly']);
}
session_destroy();
header('Location: /login.php');
exit;
24 changes: 17 additions & 7 deletions src/Domain/Security/AuthManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,18 +51,26 @@ public function login($username, $password) {
try {
// Verificar se usuario esta bloqueado
$stmt = $this->db->prepare("
SELECT id, username, email, password_hash, tentativas_login, bloqueado_ate, nome_completo
FROM usuarios_admin
SELECT id, username, email, password_hash, tentativas_login, bloqueado_ate, nome_completo, status, papel
FROM usuarios_admin
WHERE username = ? OR email = ?
");
$stmt->execute([$username, $username]);
$usuario = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$usuario) {
$this->registrarTentativa(null, $username, false, 'Usuario nao encontrado');
return ['sucesso' => false, 'mensagem' => 'Usuario ou senha invalidos'];
}


// Verificar status da conta
if ($usuario['status'] === 'pendente') {
return ['sucesso' => false, 'mensagem' => 'Sua conta aguarda aprovação de um administrador'];
}
if ($usuario['status'] === 'inativo') {
return ['sucesso' => false, 'mensagem' => 'Conta desativada. Entre em contato com o administrador'];
}

// Verificar bloqueio
if ($usuario['bloqueado_ate'] && strtotime($usuario['bloqueado_ate']) > time()) {
$tempo_restante = ceil((strtotime($usuario['bloqueado_ate']) - time()) / 60);
Expand Down Expand Up @@ -107,10 +115,12 @@ public function login($username, $password) {

// Configurar sessao
session_regenerate_id(true);
$_SESSION['user_id'] = $usuario['id'];
$_SESSION['username'] = $usuario['username'];
$_SESSION['user_id'] = $usuario['id'];
$_SESSION['username'] = $usuario['username'];
$_SESSION['user'] = $usuario['username']; // compatibilidade com admin.php
$_SESSION['nome_completo'] = $usuario['nome_completo'];
$_SESSION['criado_em'] = time();
$_SESSION['papel'] = $usuario['papel'];
$_SESSION['criado_em'] = time();
$_SESSION['ultima_atividade'] = time();

$this->registrarTentativa($usuario['id'], $username, true, null);
Expand Down
36 changes: 36 additions & 0 deletions src/UmcFunctions.php
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,42 @@ function isDebugMode() {
}
}

/**
* Renderiza badge de usuário logado após o Navbar.
* Injeta JS que modifica o botão "Área Admin" dinamicamente.
*/
function renderNavbarAuthBadge(): void {
if (session_status() === PHP_SESSION_NONE) {
return;
}
$user_id = $_SESSION['user_id'] ?? null;
$username = htmlspecialchars($_SESSION['username'] ?? '', ENT_QUOTES);
$nome = htmlspecialchars($_SESSION['nome_completo'] ?? $username, ENT_QUOTES);
$papel = $_SESSION['papel'] ?? '';

if (!$user_id) {
return;
}

$admin_href = in_array($papel, ['admin', 'pesquisador']) ? '/admin.php' : '/dashboard.php';
echo <<<HTML
<script>
(function(){
document.addEventListener('DOMContentLoaded', function() {
var btn = document.querySelector('.nav-cta-admin');
if (!btn) return;
btn.href = '{$admin_href}';
btn.innerHTML = '<i class="fas fa-user-circle" aria-hidden="true"></i> {$nome}';
btn.title = 'Logado como {$username}';
btn.insertAdjacentHTML('afterend',
'<a href="/logout.php" class="nav-cta-admin" style="margin-left:.375rem;background:rgba(239,68,68,.15);color:#fca5a5;border-color:rgba(239,68,68,.3);" title="Sair"><i class=\"fas fa-sign-out-alt\"></i></a>'
);
});
})();
</script>
HTML;
}

/**
* Log de acesso (LGPD)
*/
Expand Down
Loading
Loading