106 lines
4.1 KiB
PHP
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);
|
|
}
|
|
}
|