4
respostas

Dúvida em relação a lógica de permissões

Oi, boa tarde =)

Gostaria de tirar uma dúvida a respeito da lógica de permissões usada, visto que achei que não foi muito bem explicada essa parte. Nós temos 3 tabelas direcionadas a essa regra, sendo ela a tabela de "roles_permissions", "user_permissions" e "user_roles" (Eu mudei o nome delas para inglês, para ficar mais padronizado). Logo, pelo que eu entendi, eu posso ter uma permissão chamada "Editar", um cargo chamado "Editor", e outro cargo chamado "Editor Funcional". Eu posso atribuir o cargo de "Editor" a um usuário, e definir na rota .put, que ele vai conseguir editar, certo? Assim como, eu posso atribuir a permissão "Editar" diretamente a um usuário, definir essa permissão na rota .put, e ele também vai conseguir editar. Agora no último caso, o "Editor Funcional", eu teria que atribuir a permissão de "Editar" ao cargo de "Editor Funcional", e aí sim eu definiria ele no .put da rota desejada, permitindo que o usuário que tivesse esse cargo conseguisse editar. O meu ponto é, no final isso não ficou redundante? Parece que essa tabela, a "roles_permissions", não faz muito sentido, visto que as outras duas já supririam a demanda inicial.

Agradeço a ajuda de todos, principalmente caso eu tenha entendido errado a l

4 respostas

Olá Victor, tudo bem?

A ideia de ter essas três tabelas "roles_permissions", "user_permissions" e "user_roles" é para proporcionar uma maior flexibilidade na hora de definir as permissões dos usuários.

Vamos usar um exemplo prático para esclarecer isso. Imagine que temos um sistema com muitos usuários e muitos cargos diferentes, como "Editor", "Editor Funcional", "Administrador", etc. Cada um desses cargos pode ter permissões diferentes, por exemplo, um "Editor" pode ter permissão para editar e criar novos posts, enquanto um "Editor Funcional" pode apenas editar posts existentes.

A tabela "roles_permissions" serve para definir essas permissões para cada cargo. Assim, quando um novo usuário é criado e é atribuído um cargo a ele, automaticamente ele herda todas as permissões desse cargo.

Agora, imagine que temos um usuário específico que é um "Editor", mas por algum motivo, ele precisa ter a permissão de deletar posts, que normalmente é uma permissão de um "Administrador". Em vez de criar um novo cargo só para esse usuário, podemos simplesmente adicionar essa permissão diretamente a ele na tabela "user_permissions".

Então, a tabela "user_roles" é usada para atribuir um cargo a um usuário, a tabela "roles_permissions" é usada para atribuir permissões a um cargo e a tabela "user_permissions" é usada para atribuir permissões diretamente a um usuário.

Espero que isso esclareça sua dúvida. A ideia é que essa estrutura permita uma maior flexibilidade na hora de definir as permissões, permitindo que você possa ter permissões específicas para cada usuário, se necessário, além das permissões que são herdadas através do seu cargo.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Confesso que ainda está meio nublado kkkk. Nas rotas por exemplo, como seria definido então?

Digamos que tenhamos o seguinte cenário:

Temos o Victor e o João de Users. De cargo, temos o de ChefedosProdutos e EditordosProdutos. De permissões, temos 4! Sendo elas, visualizar, editar, apagar e criar.

Não seria mais fácil eu atribuir as permissoes com os cargos na rota específica? Por exemplo: .delete('/produto/id/:id', roles(["ChefedosProdutos"]), permissoes(["apagar"]), ProdutoController.deleteById)

Nesse caso, apenas o usuário com a role de ChefedosProdutos e a permissão de apagar, vai conseguir acessar a rota e apagar o item. Onde que a tabela roles_permissions entraria nesse caso?

Podemos citar tambem um caso do tipo, João tem o cargo de EditordosProdutos e tem a permissao de editar, não bastaria eu colocar assim na rota " .put('/produto/id/:id', roles(["ChefedosProdutos", "EditordosProdutos"]), permissoes(["editar"]), ProdutoController.updateById)" que também serviria? Assim tanto o chefe quanto o editor conseguiriam acessar a rota, e como eles tem a permissao de editar, conseguiriam editar o item.

O que eu achei que seria o cenário mais adequado é:

A tabela roles_permissions não existiria, apenas a user_roles e user_permissions. Feito isto, a tabela roles serviria mais para identificar um usuário, com exceção do Administrador, no qual as rotas dele iriam requerer o cargo de administrador. Já as outras rotas mais comuns, como por exemplo a de produtos, iriam requerer permissões específicas, por exemplo, "Criar Livro", "Editar Livro" e assim por diante. Visto que um usuário pode ter mais de uma permissão, isso permitiria um controle mais refinado das restrições de cada rotas! O único ponto negativo que eu vejo, é que caso existisse muitas tabelas, iria ter uma grande quantidade de permissões, e elas ainda vão ser adicionadas individualmente a cada usuário do sistema... Porém, é a melhor maneira que eu pensei de ter um controle mais granular das rotas do sistema... Estou correto? Há alguma maneira de melhorar isso?

Acabei refatorando essa parte do código. Deixei as três tabelas, porém mudei o middleware, services/controllers e as rotas. Agora, é possível adicionar vários cargos de forma independente a um usuário (Sem excluir os que foram adicionados em outro momento), assim como excluir um cargo de um usuário de forma individual. O mesmo vale para as permissões, isto é, tanto a users_permissions como a roles_permissions.

Nas rotas, ela vai requerer o middleware allPermissions, que primeiro irá verificar se o cargo do usuário possui determinada permissão, e caso não tenha, ele vai ver nas permissões individuais do usuário, permitindo um ajuste mais fino. Acho que de certa forma ficou parecido com o original, mas usei nomes mais descritivos e afins até para melhorar o entendimento. A quem interessar, segue o link do projeto no meu GitHub: "https://github.com/victorgriggi0/innovation-api.git"

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software