Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 67 – API JavaScript, Node.js e Express – Role-Based Access Control – RBAC implementation

Imagem destacada da aula de API

Introdução (3 min)

Imagine um hospital. Nem todos têm acesso a todas as áreas, certo? Médicos acessam prontuários, enfermeiros gerenciam medicamentos, e pacientes visualizam seus próprios dados. Este controle de acesso, baseado em funções (roles), é o que vamos implementar hoje com RBAC em nossas APIs. É um componente estratégico para a segurança e organização de aplicações modernas, vital para proteger informações sensíveis e garantir a integridade do sistema. Nesta aula, construiremos um sistema RBAC simples, mas funcional, usando Node.js e Express.

Conceito Fundamental (7 min)

Role-Based Access Control (RBAC) é um método para restringir o acesso a recursos com base nas funções dos usuários dentro de um sistema. A terminologia chave inclui: usuário, função (role) e permissão. Um usuário possui uma ou mais funções, e cada função tem um conjunto específico de permissões. Por exemplo, a função “Administrador” pode ter permissão para “criar”, “ler”, “atualizar” e “excluir” usuários, enquanto a função “Editor” pode ter permissão apenas para “ler” e “atualizar”.

Em produção, RBAC é usado em sistemas de gerenciamento de conteúdo (CMS), plataformas de e-commerce e aplicações corporativas. Integra-se com bancos de dados para armazenar informações de usuários e funções, e com middlewares para aplicar as regras de acesso. As vantagens incluem gestão simplificada de permissões, segurança aprimorada e auditoria facilitada. A principal desvantagem pode ser a complexidade inicial de configuração, especialmente em sistemas com muitas funções e permissões.

Implementação Prática (10 min)

const express = require('express');
const app = express();

// Simulação de banco de dados (em produção, use um banco de dados real) const users = [ { id: 1, name: 'Alice', role: 'admin' }, { id: 2, name: 'Bob', role: 'editor' }, ];

const roles = { admin: ['read', 'write', 'delete'], editor: ['read', 'write'], };

// Middleware para verificar permissões function checkPermission(permission) { return (req, res, next) => { const user = users.find(u => u.id === parseInt(req.params.userId)); // Busca usuário pelo ID

if (!user) return res.status(404).send('Usuário não encontrado');

if (roles[user.role].includes(permission)) { next(); // Usuário tem permissão } else { res.status(403).send('Acesso negado'); // Usuário não tem permissão } }; }

// Rotas protegidas por RBAC app.get('/users/:userId', checkPermission('read'), (req, res) => { const user = users.find(u => u.id === parseInt(req.params.userId)); res.send(user); });

app.post('/users/:userId', checkPermission('write'), (req, res) => { // Lógica para atualizar usuário res.send('Usuário atualizado'); });

app.delete('/users/:userId', checkPermission('delete'), (req, res) => { // Lógica para deletar usuário res.send('Usuário deletado'); });

// Inicia o servidor (HostGator Plano M compatível) const port = process.env.PORT || 3000; app.listen(port, () => console.log(Servidor rodando na porta ${port}));

Exercício Hands-On (5 min)

Crie uma nova rota /articles/:articleId com os métodos GET, POST e DELETE. Implemente o RBAC para que apenas administradores possam criar e excluir artigos, enquanto editores e administradores possam lê-los. Utilize a mesma estrutura de checkPermission adaptando para artigos.

Solução:

Adicione as rotas /articles/:articleId e ajuste o middleware checkPermission para verificar as permissões para ‘articles’.

Testes:

Faça requisições GET, POST e DELETE para as rotas /users e /articles com diferentes IDs de usuário simulando diferentes roles. Observe as respostas do servidor para validar o funcionamento do RBAC.

Troubleshooting:

Verifique se as funções e permissões estão corretamente definidas. Certifique-se de que o middleware checkPermission está sendo chamado antes das rotas protegidas.

Próximos passos:

Explore bibliotecas de RBAC mais robustas como o node-acl. Integre com um banco de dados real para persistir as informações de usuários e funções. Implemente logging profissional para registrar os acessos e tentativas de acesso negadas.

🚀 Pronto para a próxima aula?

Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!

📚 Ver todas as aulas