🚀 Capítulo 15: Autorização e Papéis (Tema: Naruto)

NOTE

Este capítulo utiliza a temática de Naruto para explicar a Autorização. Na Vila da Folha, um Genin não pode ler os pergaminhos proibidos que só os Hokages têm acesso!


1. 🎯 Objetivo da Aula

Compreender a diferença entre Autenticação (quem você é) e Autorização (o que você pode fazer), e como implementar o controle de acesso baseado em papéis (RBAC).

2. 🏢 O Cenário Prático (Seu Desafio)

Você foi contratado pelo Hokage para organizar o sistema de arquivos da Vila da Folha. Nem todo ninja pode ver tudo.

  • Genin: Só pode ver missões de Rank D e C.
  • Chunin: Pode ver missões de Rank B e A.
  • Jonin: Pode ver todas as missões e ler pergaminhos de jutsus avançados.
  • Hokage: Tem acesso total e pode apagar registros.

Seu desafio é criar as regras de bloqueio para que um Genin não consiga acessar a sala do Hokage!

3. 🧠 Fundamentos: A Teoria Traduzida

Muitas pessoas confundem esses dois conceitos, mas eles são bem diferentes:

🔑 1. Autenticação (Authentication)

É o ato de verificar quem você é. Geralmente envolve usuário, senha ou um token JWT.

  • Na Vila: É o ninja mostrar a sua bandana e identificação no portão da vila.

📜 2. Autorização (Authorization)

É o ato de verificar o que você tem permissão para fazer. Acontece sempre DEPOIS da autenticação.

  • Na Vila: O guarda vê que você é um Genin e te barra na porta da biblioteca de jutsus proibidos.

👥 3. RBAC (Role-Based Access Control)

É o Controle de Acesso Baseado em Papéis (Funções). Em vez de dar permissão para cada usuário individualmente, criamos “Papéis” (Roles) como ADMIN, USER, EDITOR e damos as permissões para o papel. Os usuários herdam as permissões do papel que possuem.


4. 📖 Exemplo Guiado: Middleware de Permissão

Podemos usar um middleware (como vimos no capítulo 12) para verificar o papel do usuário que está no token JWT:

const verificarAcessoHokage = (req, res, next) => {
    // Supondo que o papel veio no token decodificado
    const papelUsuario = req.usuario.papel; 
 
    if (papelUsuario !== 'HOKAGE') {
        return res.status(403).json({ 
            erro: "Acesso negado. Apenas o Hokage pode acessar esta área." 
        });
    }
    
    next(); // Se for Hokage, permite o acesso!
};

5. 🛠️ Prática Obrigatória 1: Quem pode fazer o quê?

Com base no cenário da Vila da Folha, diga qual status HTTP (200, 401 ou 403) o servidor deve retornar nas seguintes situações:

  1. Um Genin tenta acessar a rota /permissao/jutsus-proibidos.
  2. Um usuário tenta acessar a rota /missoes sem enviar nenhum token de login.
  3. O Hokage acessa a rota /painel-de-controle.

6. 🛠️ Prática Obrigatória 2: Autenticação vs Autorização

Diga se as situações abaixo são problemas de Autenticação ou de Autorização:

  1. O usuário esqueceu a senha e não consegue entrar no sistema.
  2. O usuário conseguiu entrar no sistema, mas tentou deletar um produto e apareceu “Ação não permitida para o seu nível”.

7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 15 Backend) e clique em Commit to main.
  2. Envie para a Nuvem (Push): Clique em Push origin.

8. 📂 Estrutura de Pastas

mod_07_backend_e_apis/
├── capitulos/
│   ├── capitulo_15_autorizacao.md
│   └── codigos/
│       └── cap15/
│           └── controle_acesso.js

9. 💡 Checkpoint de Lógica

Por que é importante fazer a validação de autorização no Backend, mesmo que o botão de “Deletar” já esteja escondido no Frontend para usuários comuns?

10. 🔥 Desafio de Fixação

Pesquise o que significa a sigla ABAC (Attribute-Based Access Control) e como ela difere do RBAC.

🔑 Gabarito de Código/Fórmulas

Gabarito da Prática 1:

  1. Genin em área proibida 403 Forbidden (Ele está autenticado, mas não tem autorização).
  2. Sem token 401 Unauthorized (Não sabemos quem ele é).
  3. Hokage no painel 200 OK (Ele tem acesso total).

Capitulo Anterior | Proximo Capitulo