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.
-
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.
-
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:
- 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.