Há alguns dias, alguns de meus colegas me abordaram sobre um problema com um aplicativo de código aberto chamado Makaut Buddy , que é uma plataforma de compartilhamento de notas projetada para nossa universidade, com o objetivo de ajudar os alunos a compartilhar notas principais, questões de exames anteriores e tutoriais do YouTube de forma eficiente. .
Embora tivessem desenvolvido com sucesso um sistema para carregar recursos, encontraram o desafio de garantir que apenas indivíduos autorizados pudessem carregar conteúdo.
Conforme mostrado na demonstração abaixo, qualquer usuário pode criar um recurso após se inscrever. Isso representou um grande problema porque não conseguimos regular o que os usuários enviam; alguns podem até ter carregado conteúdo prejudicial ou perturbador.
Inicialmente, eles definiram uma função de administrador e concederam privilégios administrativos a um grupo seleto de indivíduos. No entanto, à medida que o número de funções aumentou, o código tornou-se cada vez mais complexo e difícil de gerir.
Foi então que tive a ideia de escrever este artigo para aumentar a conscientização sobre maneiras eficientes de gerenciar autorização usando um modelo de controle de acesso baseado em função (RBAC) com a ajuda de ferramentas de autorização de terceiros, como Permit.
Além de implementar o RBAC, também introduzimos um sistema de aprovação de solicitação de acesso. Este sistema garante que qualquer usuário que queira fazer upload de conteúdo deve primeiro solicitar acesso, que um administrador pode então aprovar ou negar. Essa camada adicional de segurança nos ajuda a manter a integridade do conteúdo do Makaut Buddy.
Neste artigo, usei JavaScript como linguagem de programação e Next.js como estrutura. No entanto, os conceitos discutidos aqui não são específicos da linguagem e você pode implementá-los na sua linguagem de programação preferida.
Ao final deste artigo, você saberá como implementar um modelo RBAC básico em sua aplicação.
Dito isso, vamos mergulhar!
Lembra daquelas manhãs correndo para a escola? O segurança que verifica sua identidade é um exemplo perfeito de autenticação. Eles estão verificando sua identidade como estudante autorizado no campus. Mas esse é apenas o primeiro passo. Mesmo depois de ser identificado, você não entraria em qualquer sala de aula, certo? É aí que entra a autorização.
Pense no seu horário de aula como sua autorização. Ele concede acesso a áreas específicas (salas de aula) com base na sua função (aluno matriculado naquela turma). Você não estaria autorizado a entrar na sala dos professores ou na seção restrita da biblioteca – mesmo sendo um estudante (autenticado).
A diferença entre autenticação e autorização é como perguntar “Quem é você?” vs “O que você tem permissão para fazer?”
A autorização é importante em todas as organizações, pois impede que indivíduos executem ações que não estão autorizados a realizar. Isso garante a segurança da organização e ajuda a prevenir perdas.
Vamos ilustrar a afirmação acima com um exemplo:
Em uma empresa, existem alguns engenheiros seniores com profunda experiência e alguns estagiários ainda aprendendo o básico. Você pode imaginar o desastre que causaria se tanto o engenheiro sênior quanto o estagiário tivessem o mesmo nível de permissões. Os estagiários que ainda estão aprendendo podem, sem saber, cometer algum erro pelo qual a empresa terá que pagar. Em situações como essas, o modelo de controle de acesso baseado em função funciona melhor porque as permissões não são atribuídas a indivíduos, em vez disso, são atribuídas a funções. Por exemplo, apenas um engenheiro sênior ou líder técnico pode excluir recursos, enquanto todos os estagiários só podem visualizar e gerenciar recursos.
A seguir, vamos ver como podemos implementar o RBAC em uma aplicação.
Primeiro, precisamos definir funções e atribuir permissões a cada função.
Nota: Uma função é a posição ou finalidade que alguém ocupa em uma organização. Precisamos de funções para que possamos diferenciar os indivíduos com base nas permissões ou privilégios atribuídos a essa função.
Precisamos de uma maneira de atribuir uma função a cada usuário do aplicativo. Isso geralmente é feito após o usuário se inscrever.
Precisamos de uma API em nosso back-end que receba a operação que um usuário deseja realizar e verifique a autorização do usuário. O diagrama abaixo lhe dará uma melhor compreensão:
No entanto, não vamos implementar todo o modelo do zero. Em vez disso, usaremos uma ferramenta de autorização de terceiros chamada Permit, que tornará todo o processo de estabelecimento de autorização muito tranquilo e eficiente para nós, para que você possa trabalhar nos recursos que realmente importam.
O diagrama abaixo mostra como aproveitaremos o Permit para implementar o RBAC em nossas aplicações:
Nesta seção, percorreremos as etapas para implementar o controle de acesso baseado em função (RBAC) usando Permit.
Como estamos usando uma Permit para estabelecer um modelo RBAC, primeiro precisamos criar uma conta Permit e um espaço de trabalho:
Agora precisamos criar um Resource que é a entidade à qual queremos controlar o acesso em nossa aplicação.
Por exemplo, em um aplicativo de anotações, o recurso seria Notas e as ações poderiam ser Criar , Ler, Atualizar e Excluir.
Para criar um recurso:
No exemplo acima, o nome do recurso é Notas e as ações que o usuário tem permissão para executar são Criar, Ler, Atualizar e Excluir.
Após criar o Recurso, temos que definir os papéis que existirão em nossa aplicação.
Neste caso, como o aplicativo é um aplicativo de compartilhamento de notas para uma universidade, as funções serão:
Depois de criarmos ambas as funções, agora temos que atribuir as ações que cada função pode realizar em nosso editor de políticas, conforme mostrado abaixo:
Agora que sua conta Permit está configurada, você pode começar a criar as APIs de back-end para se comunicar com o Permit. Usaremos o SDK Node.js fornecido pela Permit. Você pode encontrar o SDK para sua linguagem de programação preferida na documentação de permissão.
Sincronizar usuários e atribuir função padrão
Primeiro, precisamos ter certeza de que cada usuário que se inscreve em nosso aplicativo está sincronizado com o diretório de permissão e recebe uma função padrão de Aluno.
Para fazer isso, precisamos criar uma API backend conforme mostrado abaixo:
Esta API faz duas coisas:
createUser
.assignRole
.
Você pode ler mais sobre todas as APIs que o Permit fornece em documentos de permissão
Obtenha a função do usuário
Em seguida, precisamos criar uma API de backend que obtenha a função do usuário do Permit.io e a envie de volta ao frontend.
A API mostrada abaixo obtém o usuário usando permit.api.users.get(user_key)
Esta API obtém a função de usuário com a qual podemos manipular nossos componentes front-end para permitir que apenas pessoas com funções especiais possam vê-la.
Você também pode verificar a função permit.check() para verificar se um usuário com uma determinada função tem permissão para realizar uma operação.
Com isso, implementamos com sucesso um modelo RBAC usando Permit. Agora podemos integrar as rotas de back-end com a estrutura de front-end ou biblioteca de sua escolha para concluir a configuração.
Para completar nossa configuração, precisamos de um componente que permita aos usuários solicitar atualizações de funções:
Os Elementos de Permissão fazem parte do “Permit Share-If”, que é um conjunto de componentes de UI pré-construídos e incorporáveis que facilitam o compartilhamento de acesso em aplicativos. Projetados para fornecer controle de acesso totalmente funcional, eles tornam a delegação de gerenciamento de permissões aos seus usuários simples e segura.
É isso que criamos os elementos.
Antes de usar os elementos, precisamos criar uma API backend para efetuar login do usuário no elemento permit,
Observação: é importante fazer o login do usuário o mais cedo possível, de preferência logo após o cadastro.
Agora, vamos dar uma olhada no código:
Código da API veiculado no endpoint /api/v1/login_permit/?userkey=user_key
:
O código frontend para implementar o login será semelhante a este:
É isso que configuramos nosso código.
Agora, só precisamos ir até o painel de permissão e copiar o iframe de gerenciamento de usuários e o iframe de solicitação de acesso, conforme mostrado abaixo:
Agora que temos o código, precisamos adicionar o iframe
ao nosso frontend onde queremos mostrar os elementos aos nossos usuários, precisamos:
Com isso, configuramos com sucesso um sistema de aprovação de acesso onde os usuários podem solicitar atualizações de funções e os administradores podem aprovar ou negar essas solicitações.
Esta demonstração mostra como um usuário com a função "Administrador" pode acessar o widget de upload
Esta demonstração ilustra como um usuário com a função "Aluno" não pode ver o widget de upload e pode solicitar uma atualização para a função "Administrador":
Esta demonstração mostra como usuários privilegiados podem aprovar solicitações de atualização de função:
Esta demonstração demonstra como um usuário, após ser atualizado de "Aluno" para "Admin", obtém acesso ao widget de upload
É isso!
Obrigado por ler até aqui.
Neste tutorial, exploramos a autorização e entendemos porque a autorização é muito importante em qualquer aplicação. Também vimos como podemos instalar e configurar Permit para proteger o aplicativo e controlar o acesso do usuário com base em suas funções.
Este artigo é apenas a ponta do iceberg da autorização e do modelo RBAC. Você pode consultar ABAC e ReBAC para obter uma autorização mais refinada.