Autorização e Autenticação em PHP: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Autorização e Autenticação em PHP: do básico à segurança

A segurança de aplicações web começa com a implementação correta da autenticação (verificação da identidade do usuário) e da autorização (verificação de seus direitos de acesso). Em PHP, esses mecanismos podem ser implementados tanto com funções nativas quanto com bibliotecas especializadas. Neste artigo, abordaremos os conceitos-chave, escreveremos exemplos de código e analisaremos as melhores práticas de segurança.



1. Conceitos básicos: autenticação vs autorização

Antes de escrever código, é importante distinguir claramente os dois termos:

  • Autenticação — processo de verificar se o usuário é quem diz ser (geralmente através de login e senha).
  • Autorização — processo de determinar quais recursos ou ações estão disponíveis para um usuário autenticado (por exemplo, papel "admin" ou "user").

Erros na implementação de qualquer uma dessas etapas podem levar a vazamento de dados ou acesso não autorizado.



2. Autenticação básica via sessões (PHP nativo)

A forma mais comum é o uso de sessões. O PHP fornece o mecanismo embutido $_SESSION. Vejamos um exemplo simples.



Passo 1: Formulário de login (login.php)

<?phpsession_start();?><!DOCTYPE html><html><head>    <title>Entrar no site</title></head><body>    <form method="POST" action="login.php">        <label>Usuário:</label>        <input type="text" name="username" required>        <label>Senha:</label>        <input type="password" name="password" required>        <button type="submit" name="login">Entrar</button>    </form></body></html>


Passo 2: Processamento do login (mesmo login.php)

<?phpsession_start();require_once 'db.php'; // conexão com o BD

if (isset($_POST['login'])) { $username = trim($_POST['username']); $password = $_POST['password'];

// 1. Consulta preparada para proteção contra SQL injection $stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch();

// 2. Verificação da senha via password_verify if ($user && password_verify($password, $user['password_hash'])) { // Autenticação bem-sucedida $_SESSION['user_id'] = $user['id']; $_SESSION['logged_in'] = true; header("Location: dashboard.php"); exit; } else { $error = "Usuário ou senha inválidos"; }}?>


Passo 3: Verificação de autorização na página protegida

<?phpsession_start();if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {    header("Location: login.php");    exit;}// Acesso permitidoecho "Bem-vindo, usuário #" . htmlspecialchars($_SESSION['user_id']);?>


3. Hash de senhas: nunca armazene senhas em texto puro

O PHP fornece funções seguras para trabalhar com senhas:

  • password_hash($password, PASSWORD_BCRYPT) — cria um hash com salt automaticamente.
  • password_verify($password, $hash) — verifica a senha contra o hash.

Exemplo de registro de usuário:

<?php$password = "user123";$hash = password_hash($password, PASSWORD_BCRYPT);// Salvar $hash no banco de dados$stmt = $pdo->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)");$stmt->execute([$username, $hash]);?>

Importante: nunca use md5() ou sha1() para senhas — eles estão obsoletos e são facilmente quebrados.



4. Autorização baseada em papéis (Role-Based Access Control)

Para diferenciar permissões

Recommendations