Material organizado para estudo progressivo, com leitura confortável, recursos complementares e navegação para a próxima etapa da disciplina.
Resumo
Aula 7: A aula implementou o sistema de login, sessão e área administrativa, usando AuthController.php, password_verify(), $_SESSION, session_start(), logout e proteção de rotas. Também foi mostrado como proteger o CRUD de games para usuários logados e o CRUD de usuários apenas para administradores, além da tela app/views/auth/login.php.
Linguagens de Programação16/04/2026Aula interativa importada
Leitura pensada para estudo, consulta e revisão. Use a navegação lateral para alternar entre etapas da aula.
Estudo
Conteúdo interativo — HTML importado
Aula 7 - Login, Sessão e Área Administrativa
Abra o material em tela cheia para estudar com conforto, sem sair da disciplina.
Aula 7 - Login, Sessão e Área Administrativa
100%
Carregando conteúdo interativo...
Aula 7 — Login, Sessao e Area Administrativa ◀▶ 1 / 0Tela cheia A7 GameStock 2026 V2 · Aula 7 Login, Sessao e Area Administrativa Nesta aula vamos fazer o usuario entrar no sistema, gravar dados em $_SESSION, proteger os CRUDs e criar a acao de sair com seguranca. AuthControllerSessionpassword_verify()ProtecaoLogout /auth/login Entrar email@gamestock.com ******** Acessar painel 01 01·Objetivo O que muda depois do login? Identificar O sistema descobre quem esta tentando acessar. Validar Compara senha digitada com o hash salvo no banco. Guardar Salva id, nome, e-mail e perfil na sessao. Proteger Bloqueia games e usuarios para visitantes. A7 Conexao com a aula 6A tabela usuarios e a senha com password_hash() ja estao prontas. Agora usamos password_verify() para autenticar. 02 02·Onde Fica Mapa da autenticação /GameStock2026V2 |-- app/ | |-- config/ | | |-- config.php inicia sessao e helpers | | `-- Database.php conexao PDO | |-- controllers/ | | |-- AuthController.php login, autenticar e sair | | |-- GameController.php exige usuario logado | | `-- UserController.php exige perfil admin | |-- models/ | | |-- BaseModel.php | | `-- User.php busca usuario e verifica senha | `-- views/ | |-- auth/ | | `-- login.php formulario de login | |-- games/ telas protegidas | `-- users/ telas protegidas para admin `-- public/ |-- assets/css/style.css visual do login e painel |-- assets/js/app.js validacao simples do login `-- index.php rotas auth e rotas protegidas 1 EntradaO navegador sempre chega por public/index.php. 2 ControllerAuthController.php decide mostrar o login, autenticar ou sair. 3 ProtecaoGameController e UserController chamam helpers de sessao antes de liberar as telas. 03 03·Rotas Rotas de autenticação Rota Metodo Onde chama Uso ?url=auth/login GET AuthController::login() Mostra formulario. ?url=auth/autenticar POST AuthController::autenticar() Valida e cria sessao. ?url=auth/sair GET AuthController::sair() Encerra sessao. ?url=games GET GameController::listar() Precisa estar logado. ?url=users GET UserController::listar() Precisa ser admin. ARQ Onde ficaEssas rotas sao tratadas no public/index.php. As tres primeiras sao publicas; as demais dependem da sessao. 04 04·Front Controller Rotas no public/index.php public/index.php - rotas de login PHPCopiar $url = $_GET['url'] ?? 'auth/login'; switch ($url) { case 'auth/login': (new AuthController())->login(); break; case 'auth/autenticar': (new AuthController())->autenticar(); break; case 'auth/sair': (new AuthController())->sair(); break; case 'games': (new GameController())->listar(); break; case 'users': (new UserController())->listar(); break; } 1 Login publico auth/login precisa abrir mesmo sem sessao. 2 Autenticar auth/autenticar recebe POST do formulario. 3 Area admin games e users deixam os controllers decidirem a protecao. 05 05·Sessao Helpers em config.php app/config/config.php - sessao e protecao PHPCopiar if (session_status() === PHP_SESSION_NONE) { session_start(); } function estaLogado(): bool { return isset($_SESSION['usuario_id']); } function exigirLogin(): void { if (!estaLogado()) { header('Location: ' . BASE_URL . '/index.php?url=auth/login'); exit; } } function usuarioLogado(): array { return [ 'id' => $_SESSION['usuario_id'] ?? null, 'nome' => $_SESSION['usuario_nome'] ?? '', 'perfil' => $_SESSION['usuario_perfil'] ?? '' ]; } function exigirPerfil(array $perfis): void { exigirLogin(); if (!in_array($_SESSION['usuario_perfil'], $perfis)) { http_response_code(403); echo 'Acesso negado.'; exit; } } OK Onde ficaEssas funcoes ficam no app/config/config.php, carregado antes dos controllers. ! session_start()Precisa acontecer antes de ler ou escrever $_SESSION. 403 PerfilexigirPerfil(['admin']) sera usado para proteger o CRUD de usuarios. 06 06·Model Buscando usuario pelo e-mail app/models/User.php - metodos usados no login PHPCopiar public static function buscarPorEmail($email): ?array { $stmt = self::db()->prepare( 'SELECT * FROM usuarios WHERE email = :email LIMIT 1' ); $stmt->execute([ ':email' => $email ]); $usuario = $stmt->fetch(); return $usuario ?: null; } public static function verificarSenha($senhaDigitada, $hashSalvo): bool { return password_verify($senhaDigitada, $hashSalvo); } ARQ Onde ficaEsses metodos entram no arquivo app/models/User.php. @ BuscaO login comeca procurando o usuario pelo e-mail digitado. HASH Senhapassword_verify() compara a senha digitada com o hash criado na Aula 6. 07 07·Controller Criando o AuthController app/controllers/AuthController.php - login() PHPCopiar <?php class AuthController { public function login() { if (estaLogado()) { header('Location: ' . BASE_URL . '/index.php?url=games'); exit; } view('auth/login', [ 'titulo' => 'Login' ]); } } 1 Arquivo Crie app/controllers/AuthController.php. 2 Se ja logou Redireciona para games, evitando mostrar login de novo. 3 Se nao logou Carrega a view app/views/auth/login.php. 08 08·Autenticar Validando login e criando sessão app/controllers/AuthController.php - autenticar() PHPCopiar public function autenticar() { $email = trim($_POST['email'] ?? ''); $senha = $_POST['senha'] ?? ''; $usuario = User::buscarPorEmail($email); if (!$usuario || !User::verificarSenha($senha, $usuario['senha'])) { view('auth/login', [ 'titulo' => 'Login', 'erro' => 'E-mail ou senha invalidos.' ]); return; } session_regenerate_id(true); $_SESSION['usuario_id'] = $usuario['id']; $_SESSION['usuario_nome'] = $usuario['nome']; $_SESSION['usuario_email'] = $usuario['email']; $_SESSION['usuario_perfil'] = $usuario['perfil']; header('Location: ' . BASE_URL . '/index.php?url=games'); exit; } OK Login corretoCria sessao e manda o usuario para o painel de games. ERRO Login incorretoVolta para a view de login com uma mensagem simples. ID Segurancasession_regenerate_id(true) evita reaproveitar um identificador antigo de sessao. 09 09·Logout Encerrando a sessão app/controllers/AuthController.php - sair() PHPCopiar public function sair() { $_SESSION = []; if (ini_get('session.use_cookies')) { $params = session_get_cookie_params(); setcookie( session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly'] ); } session_destroy(); header('Location: ' . BASE_URL . '/index.php?url=auth/login'); exit; } ARQ Onde ficaO metodo sair() fica em app/controllers/AuthController.php. MENU Link no painelO botao "Sair" aponta para index.php?url=auth/sair. FIM Depois do logoutSem sessao, qualquer tentativa de abrir games ou users volta para o login. 10 10·Protecao Protegendo os CRUDs app/controllers/GameController.php - exigir login PHPCopiar class GameController { public function __construct() { exigirLogin(); } public function listar() { $games = Game::listarTodos(); view('games/index', ['games' => $games]); } } app/controllers/UserController.php - exigir admin PHPCopiar class UserController { public function __construct() { exigirPerfil(['admin']); } public function listar() { $usuarios = User::listarTodos(); view('users/index', ['usuarios' => $usuarios]); } } LOCAL Onde fica cada protecaoGameController.php exige qualquer usuario logado. UserController.php exige perfil admin, porque gerenciar usuarios e mais sensivel. 11 11·View Tela de login em auth/login.php app/views/auth/login.php PHP/HTMLCopiar <main class="login-page"> <section class="login-box"> <h1>GameStock 2026</h1> <p>Acesse o painel administrativo</p> <?php if (!empty($erro)): ?> <div class="alerta erro"> <?= htmlspecialchars($erro) ?> </div> <?php endif; ?> <form data-form-login method="post" action="<?= BASE_URL ?>/index.php?url=auth/autenticar"> <label>E-mail</label> <input type="email" name="email" required> <label>Senha</label> <input type="password" name="senha" required> <button type="submit">Entrar</button> </form> </section> </main> ARQ Onde ficaCrie o arquivo em app/views/auth/login.php. POST ActionO formulario envia para auth/autenticar, que chama AuthController::autenticar(). ERRO MensagemA variavel $erro vem do controller quando e-mail ou senha nao conferem. 12 12·JavaScript Validação simples do login public/assets/js/app.js - formulario de login JSCopiar const formLogin = document.querySelector('[data-form-login]'); if (formLogin) { formLogin.addEventListener('submit', function (event) { const email = this.email.value.trim(); const senha = this.senha.value; if (!email.includes('@') || senha.length < 6) { event.preventDefault(); alert('Informe e-mail valido e senha com pelo menos 6 caracteres.'); } }); } ARQ Onde ficaEsse codigo entra no arquivo public/assets/js/app.js. PHP Regra importanteJavaScript ajuda a experiencia, mas o PHP ainda precisa validar no AuthController. 13 13·Area Admin Mostrando usuario logado e sair app/views/games/index.php e app/views/users/index.php - topo do painel PHP/HTMLCopiar <?php $usuario = usuarioLogado(); ?> <header class="admin-topbar"> <div> <strong>GameStock 2026</strong> <span>Painel Administrativo</span> </div> <nav> <a href="<?= BASE_URL ?>/index.php?url=games">Games</a> <?php if ($usuario['perfil'] === 'admin'): ?> <a href="<?= BASE_URL ?>/index.php?url=users">Usuarios</a> <?php endif; ?> <span class="usuario-logado"> <?= htmlspecialchars($usuario['nome']) ?> </span> <a class="btn-sair" href="<?= BASE_URL ?>/index.php?url=auth/sair">Sair</a> </nav> </header> ARQ Onde ficaEsse topo pode ser repetido nas views protegidas: games/index.php, games/criar.php, users/index.php e outras telas do painel. ADMIN Menu UsuariosMostramos o link de usuarios somente quando perfil for admin. SAIR LogoutO link aponta para auth/sair, que limpa a sessao. 14 14·Previa Fluxo final do painel /GameStock2026V2/public/index.php?url=games GameStock Games Usuarios Sair Logado como Ana Souza · admin Area administrativa Novo game Sessao Ativa Perfil admin Protecao CRUDs Tela Acesso Status CRUD de Games logado liberado CRUD de Usuarios admin liberado Login publico redirect OK Resultado esperadoO visitante ve login. O usuario logado acessa games. O admin tambem acessa usuarios. TESTE Como testarAbra ?url=games sem login: deve redirecionar para auth/login. V2 Proximo passoCom a area admin pronta, depois podemos mostrar a loja publica consumindo os games cadastrados. 15 15·Exercicios Prática da Aula 7 01 Crie as rotas auth/login, auth/autenticar e auth/sair no public/index.php.FACIL Use new AuthController() e chame os metodos login(), autenticar() e sair().Ver dica 02 Implemente AuthController::autenticar() usando User::buscarPorEmail() e password_verify().MEDIO Lembre de criar a sessao somente se o usuario existir e a senha estiver correta.Ver dica 03 Proteja GameController com exigirLogin() e UserController com exigirPerfil(['admin']).MEDIO Coloque a chamada no __construct() dos controllers.Ver dica 04 Mostre o nome do usuario logado no topo do painel e adicione o link Sair.DESAFIO Use usuarioLogado() para pegar nome e perfil da sessao.Ver dica FIM FIM·Resumo Resumo da Aula 7 01Criamos rotas publicas para login, autenticar e sair. 02Usamos password_verify() para comparar a senha digitada com o hash. 03Gravamos id, nome, e-mail e perfil em $_SESSION. 04Protegemos games para usuarios logados e usuarios para perfil admin. 05Criamos logout limpando a sessao e voltando para a tela de login. Próxima aula Loja pública e vitrine de games