['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 '' . 'Acesso negado — AçãoOpção' . '' . '' . '
' . '
🔒
' . '

Acesso negado

' . '

Seu perfil não tem permissão para acessar esta página. ' . 'Fale com um administrador se precisar desse acesso.

' . 'Voltar' . '
'; 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); } }