Executando verificação de segurança...
3

Como manipular diferentes tipos de acessos em uma aplicação ?

Estou trabalhando em uma aplicação para a realização de sorteios, e assim como todo projecto existem regras que devem ser seguidas e uma das maiores é a "restrição de acesso".

    • Como se sabe apenas os Administradores podem aprovar uma entidade para poder realizar sorteios e neste caso um usuário normal não poderia sequer ter a chance de criar um sorteio.

Para resolver esse problema separei as tabelas de Admin e User, define os campos remember_token em ambas as tabelas para armazenar o token que seria gerado no processo de fazer login ( até ai parecia certo ), mas por outro lado como são duas tabelas diferenciadas isso levaria a ter dois middleware de Autenticação para cada entidade e de certa forma demanda duplicação de código. Este metódo porémm foi o que eu adotei tudo pelo simples facto de que é mais simples e rápido. Mas pensando em optimização pensei em outra forma.

  1. Usar uma única entidade e adicionar apenas um atributo user_type para definir se é Admin ou não, mas esse pensamento levaria a sempre que a requisição chegar aos services tenha de ter o trabalho de verificar o tipo de acesso ( outro trabalho que quis evitar ). Então descartei essa.

  2. Então em meio pensamento me veio uma idéia um pouco mais ousada "Generic". Que tal criar uma função generica de validação que receba dois parametros - a Entidade e o tipo de acesso - que serão manipulados de alguma forma para definir se deve ou não constinuar? Ao momento me pareceu uma ideia genial , mas então fui ao GPT para saber o que ele tinha a dizer.

Resposta do Chat GPT

Quando perguntei ao GPT sobre a sua opinão a respeito do meu pensamento ele disse :

Sua terceira ideia, de criar uma função genérica para validação que recebe a entidade e o tipo de acesso, é uma abordagem muito elegante e escalável. Essa solução pode evitar duplicação de código e facilitar a manutenção, pois centraliza a lógica de autorização em uma única função. A função genérica também permite um controle mais orgânico e flexível, onde você pode definir regras de acesso de forma mais clara e adaptável, sem a necessidade de replicar middlewares para cada entidade.
Para implementá-la, você poderia usar uma combinação de middleware e lógica condicional dentro da função de validação, mantendo uma lista de tarefas baseada no user_type. Algo assim também tende a ser mais

Embora não tenha ficado definitivamente satisfeito então resolvi fazer outra pergunta *tem algum problema nas minhas abordagens? * , claro que não foi a melhor pergnta do mundo mas, de certa forma trouxe bons insigths :

Suas abordagens mostram um bom entendimento das opções de design para controle de acesso. Vou destacar pontos positivos e algumas questões que podem ser ajustadas ou otimizadas em cada abordagem:

  1. Separação das tabelas de Admin e Usuário:
  • Pontos Positivos: Mantém a diferenciação clara entre administradores e usuários, facilitando a criação de regras específicas para cada entidade sem sobrecarregar uma única tabela.
  • Possíveis Problemas: A duplicação de código entre middlewares para cada entidade pode aumentar a complexidade e dificultar a manutenção, além de tornar a autenticação menos eficiente. Pode ser necessário, no futuro, sincronizar funcionalidades entre os dois middlewares, o que pode levar a inconsistências se não for feito com cuidado

Ele ainda falou dde outros aspectos, mas percebi que a terceira abordagem acaba sendo mais prática por um simples motivo : Centralização das Regras de Acesso, isto que dizer que Com uma função genérica de validação, as regras de acesso são centralizadas, facilitando a manutenção e atualização. E Se por ventura ( algum dia maluco ) as regras de permissão mudarem ou novos papéis forem transferidos, apenas será necessário ajustar essa função centralizada e tudo está resolvido.

Minha Conclusão

Ao pensar em software é sempre importante pensar em performance e eficiência, o sistema vai precisar fazer o maior trabalho, no menor tempo e com o melhor desempenho. Não faça apenas algo que funcione, faça algo que funcione bem.

Claro que existem várias abordagens que de certa forma resolvam este problema, mas este foi até aonde o meu pensamento me levou ( não sei se fui no lugar certo ), e está resolvendo o meu problema.

Carregando publicação patrocinada...
1

o que ele te sugeriu é o que o marcado usa, o famoso RBAC que é acesso baseado em funções de usuário sendo o usuário uma entidade única, e os acessos de que ele pode fazer serem ageegados ao usuário. não vou repetir a conclusão pois a conclusão que fez está correta.

o que me causou certa estranheza é o fato da primeira opção ser separar em 2 tabelas, na sua conclusão vejo que compreende que é melhor otimizar as coisas e quando falamos de banco de dados quanto menos entidades semelhantes vc tiver é melhor, observando claro os conceitos de normalização de dados quando aplicáveis.

já vi muitas vezes gente criando tabela para clientes e fornecedores com os mesmos campos, coisa que um simples campo tipo já resolveria, isso não só aumenta complexidade de codificação quanto aumenta complexidade de inovação.

1

Eu já tive alguns problemas do tipo, como fazer a separação por cargos de usuários, inicialmente me foi meio impensável um jeito aceitável de fazer isso, mas posteriormente eu pensei em duas formas legais, que uso alternarnando entre elas:

uma coluna de cargo na tabela do usuario, e programar as permissões no código, não é tão prático, mas se forem poucas funções funciona bem pro propósito

uma tabela de cargo com as devidas permissões, cada permissão sendo uma coluna na tabela, depois só relacionar com uma coluna de cargo no usuário, isso é legal porque vc consegue facilmente mudar as funções de cada cargo, acho essa a ideia mais precisa no geral