🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

[Introdução ao PHP] A Magia de Lembrar o Estado! Como Criar Autenticação de Login com Sessões

Ao navegar em sites, a funcionalidade de "login" é um recurso comum, certo? Uma vez que você faz o login, seu "estado de conectado" é mantido mesmo quando você se move para páginas diferentes, permitindo que você visualize conteúdo exclusivo para membros. No entanto, a comunicação web (HTTP) é inerentemente "sem estado", o que significa que cada solicitação de página é independente e não "lembra" estados anteriores. Então, como o estado de login é mantido?

O segredo é uma tecnologia do PHP chamada Sessão (Session). Uma sessão é um mecanismo para o servidor lembrar uma "senha" para cada visitante, significando "você está conectado". Neste artigo, usaremos essa funcionalidade de sessão para explicar como criar uma "página exclusiva para membros" simples com autenticação por senha. Criando apenas dois arquivos, você pode experimentar o núcleo da funcionalidade de login essencial para os sites. Copie, cole e execute o código para sentir a magia de lembrar o estado!

Para preparar seu ambiente para rodar o PHP (ambiente de desenvolvimento), se você ainda não configurou o XAMPP, por favor, consulte [Introdução ao PHP] Um Guia Completo para Baixar e Instalar o XAMPP!. Após a instalação, basta colocar seu arquivo PHP na pasta especificada (como `htdocs`), e você estará pronto!

1. Como as Sessões Funcionam: O Truque de Memória do PHP

Uma sessão é um mecanismo para salvar temporariamente no lado do servidor a informação de um usuário que visita um site. Você pode pensar nisso como receber uma pulseira na entrada de um evento. Uma vez que você tem a pulseira (sessão iniciada), não importa para qual área (página) do local você vá, a equipe (servidor) pode reconhecê-lo como um participante legítimo (usuário conectado).

Para lidar com sessões em PHP, você só precisa lembrar de três comandos principais.

  1. session_start(): Este é o sinal de partida, dizendo: "Vou usar uma sessão agora!" Deve ser escrito no início de cada página que usa sessões.
  2. $_SESSION: Este é um array especial para armazenar informações como o estado de login. Você pode salvar e verificar dados livremente assim: $_SESSION['chave'] = valor;.
  3. session_destroy(): Elimina completamente a informação da sessão armazenada no servidor, tipicamente usada durante o logout.

Construiremos um sistema de login usando estes três comandos.

2. Na Prática! Vamos Construir um Sistema de Login

Desta vez, criaremos os dois arquivos a seguir.

Por favor, salve estes dois arquivos na mesma pasta.

Arquivo 1: login.php (Página de Login)

Este arquivo contém tanto o formulário de entrada de senha quanto a lógica para verificar se a senha enviada está correta.

<?php
// ① Inicia a sessão
session_start();

$error_message = '';
// ② Se houver uma requisição POST (envio de formulário)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // ③ Compara com a senha codificada
    $correct_password = 'password123'; // Na realidade, isso seria gerenciado em um banco de dados
    $input_password = $_POST['password'];

    if ($input_password === $correct_password) {
        // ④ Se a senha corresponder
        $_SESSION['is_logged_in'] = true; // Salva o estado de login na sessão
        header('Location: member_page.php'); // Redireciona para a página de membros
        exit;
    } else {
        // Se a senha não corresponder
        $error_message = 'Senha incorreta.';
    }
}
?>
<!DOCTYPE html>
<html lang="pt">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <style>
        body { font-family: sans-serif; padding: 20px; text-align: center; }
        .login-form { max-width: 300px; margin: 50px auto; padding: 20px; border: 1px solid #ccc; border-radius: 8px; }
        input[type="password"] { width: 100%; padding: 10px; margin: 10px 0; box-sizing: border-box; }
        button { width: 100%; padding: 10px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
        .error { color: red; margin-bottom: 10px; }
    </style>
</head>
<body>
    <div class="login-form">
        <h1>Login</h1>
        <?php if ($error_message): ?>
            <p class="error"><?php echo $error_message; ?></p>
        <?php endif; ?>
        <form action="login.php" method="POST">
            <input type="password" name="password" placeholder="Senha" required>
            <button type="submit">Entrar</button>
        </form>
    </div>
</body>
</html>

Arquivo 2: member_page.php (Página Exclusiva para Membros)

Esta página verifica a prova de estar "conectado" (informação da sessão) ao ser acessada. Se não houver prova, ela envia o usuário de volta para a página de login sem cerimônia.

<?php
// ① Inicia a sessão
session_start();

// ② Verifica o estado de login
//    Se $_SESSION['is_logged_in'] não existir ou não for true, redireciona para a página de login
if (!isset($_SESSION['is_logged_in']) || $_SESSION['is_logged_in'] !== true) {
    header('Location: login.php');
    exit;
}
?>
<!DOCTYPE html>
<html lang="pt">
<head>
    <meta charset="UTF-8">
    <title>Página Exclusiva para Membros</title>
    <style>
        body { font-family: sans-serif; padding: 20px; }
        .content { border: 2px dashed #007bff; padding: 20px; background: #f0f8ff; }
        a { color: #d9534f; }
    </style>
</head>
<body>
    <h1>Bem-vindo, Membro!</h1>
    <div class="content">
        <p>Este é um conteúdo especial que apenas usuários conectados podem ver.</p>
        <p>(A informação exclusiva para membros seria exibida aqui)</p>
    </div>
    <p><a href="logout.php">Sair</a></p>
</body>
</html>

Agora está tudo pronto! Acesse `login.php` no seu navegador e tente inserir "`password123`" como senha. Se estiver correto, você será levado para a página de membros, e se estiver errado, uma mensagem de erro será exibida. Você também pode confirmar que, se tentar acessar `member_page.php` diretamente sem fazer login, será forçadamente redirecionado para `login.php`.

3. Pontos a Serem Observados e Exemplos de Aplicação

Este mecanismo simples é poderoso, mas em uma aplicação do mundo real, você precisa aprimorar ainda mais a segurança.

Armazenamento Seguro de Senhas

Neste exemplo, escrevemos a senha diretamente no código como `'password123'` (hard-coding). Isso é muito perigoso. No desenvolvimento real, as senhas devem sempre ser processadas através de **hashing**, que as armazena de uma forma que a senha original não possa ser descoberta, e salvas em um banco de dados.

O PHP fornece as funções `password_hash()` e `password_verify()` para este propósito.

<?php
// Criptografa e salva a senha (por exemplo, durante o registro do usuário)
$hashed_password = password_hash('password123', PASSWORD_DEFAULT);

// Verifica se a senha inserida no login corresponde ao hash armazenado
if (password_verify('password123', $hashed_password)) {
    echo 'A senha é válida!';
} else {
    echo 'Senha inválida.';
}
?>

Processamento de Logout

Colocamos um link de "Sair" na página de membros. O destino deste link, `logout.php`, precisa de um processo para destruir a sessão com segurança.

<?php
session_start();

// Limpa todas as variáveis da sessão
$_SESSION = array();

// Destrói a sessão
session_destroy();

// Redireciona para a página de login após o logout
header('Location: login.php');
exit;
?>

Ao destruir completamente a sessão com `session_destroy()`, o logout é concluído.

4. Resumo

Neste artigo, aprendemos a usar a funcionalidade de sessão do PHP para fazer um site "lembrar" o estado e construir um sistema de login simples. Você entendeu o fluxo: iniciar uma sessão com `session_start()`, armazenar informações no array `$_SESSION` e manter essa informação mesmo ao navegar entre as páginas?

Este mecanismo de sessão é uma tecnologia fundamental para aplicações web, aplicada não apenas à autenticação de login, mas também em vários cenários, como formulários de entrada de várias páginas e para lembrar o conteúdo de um carrinho de compras. Encorajamos você a dominar esses conceitos básicos e a aceitar o desafio de desenvolver funcionalidades mais avançadas!