Estou atualmente terminando de montar um controle de permissões para um sistema que estou desenvolvendo, mas é com Laravel (PHP), não sei como faria em JS, mas talvez eu possa ajudar com algumas dicas.
No meu caso, eu tenho a possibilidade de utilizar um pacote já pronto, como o Laravel Permissions da Spatie. Mas eu busco sempre utilizar o mínimo de dependências externas. Visto que não é algo extremamente complexo, dá para fazer personalizado e não depender de pacotes.
O seu projeto vai depender muito da regra de negócio que você quer implementar, por exemplo:
- Será apenas um permissão simples se o usuário é admin ou não?
- Ou existirão funções (roles) já definidas e o admin só as vincula a um usuário?
- Ou ainda o admin pode criar quantas roles quiser, atribuir diversas permissões de crud a ela e vincular a um usuário?
- Um usuário poderá ter apenas um role ou diversas?
São perguntas que você tem que se fazer para ter ideia de como vai precisar fazer a modelagem do banco de dados.
No caso mais complexo que é criar várias roles, atribuir permissions de crud a ela e poder vincular mais de uma ao usuário, você vai ter um banco mais ou menos assim:
- roles - tabela que vai guardar as funções (admin, funcionário, estagiário).
- permissions - tabela que vai guardar as permissões de crud (view-product, create-product, edit-product, delete-product).
- users - tabela que vai guardar os dados dos usuários do sistema.
- permission_role - tabela intermediária/pivô que vai fazer a interligação de uma função com as permissões que ela possui.
- role_user - tabela que vai vincular um usuário com uma ou mais funções.
Uma coisa que você pode fazer é criar também uma table modules, para cadastrar os módulos do seu sistema. Por exemplo, módulo categorias, módulo produtos, módulo usuários...
Aí você cria uma regra para quando salvar no banco um novo módulo, já cria as permissões do crud junto e te economiza o tempo de criar uma por uma.
Boa sorte