Files
2026-08-21 22:57:44 +00:00

106 lines
4.1 KiB
PHP

<?php
/**
* AçãoOpção — autenticação e controle de permissões por página.
* Inclua (require_once) depois de config.php e db.php.
*/
require_once __DIR__ . '/config.php';
require_once __DIR__ . '/db.php';
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
// Páginas de administração do próprio sistema de acesso. Ficam sempre
// restritas a perfis com acesso_total, independente da tabela `paginas`
// (que serve para as páginas de negócio, essas sim configuráveis por perfil).
const AO_PAGINAS_ADMIN = [
'usuarios' => ['arquivo' => 'usuarios.php', 'nome' => 'Usuários'],
'perfis' => ['arquivo' => 'perfis.php', 'nome' => 'Perfis'],
'paginas_admin' => ['arquivo' => 'paginas_admin.php', 'nome' => 'Páginas'],
];
function ao_usuario_logado() {
return $_SESSION['ao_usuario'] ?? null;
}
function ao_exigir_login() {
if (!ao_usuario_logado()) {
$_SESSION['ao_pos_login'] = $_SERVER['REQUEST_URI'] ?? 'index.php';
header('Location: login.php');
exit;
}
}
/** true se o usuário logado pode acessar a página de negócio $chave (tabela `paginas`). */
function ao_tem_permissao($chave) {
$usuario = ao_usuario_logado();
if (!$usuario) {
return false;
}
if (!empty($usuario['acesso_total'])) {
return true;
}
return in_array($chave, $usuario['paginas'] ?? [], true);
}
/** Carrega os dados de sessão do usuário a partir do banco (login e refresh de permissões). */
function ao_carregar_sessao_usuario(PDO $pdo, array $usuarioDb, array $perfilDb) {
$paginas = [];
if (empty($perfilDb['acesso_total'])) {
$stmt = $pdo->prepare(
'SELECT p.chave FROM paginas p
INNER JOIN perfil_paginas pp ON pp.pagina_id = p.id
WHERE pp.perfil_id = ? AND p.ativo = 1'
);
$stmt->execute([$perfilDb['id']]);
$paginas = array_column($stmt->fetchAll(), 'chave');
}
$_SESSION['ao_usuario'] = [
'id' => (int) $usuarioDb['id'],
'nome' => $usuarioDb['nome'],
'email' => $usuarioDb['email'],
'perfil_id' => (int) $perfilDb['id'],
'perfil_nome' => $perfilDb['nome'],
'acesso_total' => (bool) $perfilDb['acesso_total'],
'paginas' => $paginas,
];
}
function ao_pagina_acesso_negado($ao_tema_atual = null) {
http_response_code(403);
$cor = $ao_tema_atual['cor'] ?? '#7FA653';
echo '<!doctype html><html lang="pt-BR"><head><meta charset="UTF-8">'
. '<title>Acesso negado — AçãoOpção</title>'
. '<meta name="viewport" content="width=device-width, initial-scale=1.0"></head>'
. '<body style="font-family: system-ui, sans-serif; display:flex; align-items:center; justify-content:center; '
. 'min-height:100vh; margin:0; background:#F4F5F5;">'
. '<div style="max-width:420px; text-align:center; padding:32px;">'
. '<div style="font-size:42px; margin-bottom:8px;">🔒</div>'
. '<h1 style="font-size:1.25rem; margin-bottom:8px;">Acesso negado</h1>'
. '<p style="color:#666; margin-bottom:24px;">Seu perfil não tem permissão para acessar esta página. '
. 'Fale com um administrador se precisar desse acesso.</p>'
. '<a href="index.php" style="display:inline-block; padding:10px 20px; border-radius:8px; '
. 'background:' . htmlspecialchars($cor) . '; color:#fff; text-decoration:none; font-weight:600;">Voltar</a>'
. '</div></body></html>';
exit;
}
/** Exige login e, se $chave for informada, permissão para aquela página de negócio. */
function ao_exigir_permissao($chave = null, $ao_tema_atual = null) {
ao_exigir_login();
if ($chave !== null && !ao_tem_permissao($chave)) {
ao_pagina_acesso_negado($ao_tema_atual);
}
}
/** Exige login e acesso_total (para as páginas de administração do próprio sistema). */
function ao_exigir_acesso_total($ao_tema_atual = null) {
ao_exigir_login();
$usuario = ao_usuario_logado();
if (empty($usuario['acesso_total'])) {
ao_pagina_acesso_negado($ao_tema_atual);
}
}