Esse é um assunto extenso a se discutir.
O sistema de segurança é independente.
Conforme o contrato com o cliente (exemplo se esse cliente contratou sistema de clinicas) o menu de clinicas é aberto com os módulos de clinicas (cadastros, agendamento, financeiro, faturamento, segurança, suporte) , cada módulo abre o sub menu do módulo.
Todos os menus são dinâmicos.
Se o cliente tem contrato com ERP, a segurança chama o mesmo menu que vai montar os itens referentes aos módulos do ERP.
Todos os projetos são publicados na mesma pasta.
Cada aplicação tem como prefixo: Sigla do Sistema + Sigla do Módulo + _ + nome_app +_+ tipo_app
Exemplo: erpcad_clientes_grid, erpcad)clientes_form.
A segurança é baseada na tabela usuários (este tem um campo do tipo json com os ids das empresas que ele tem acesso). O login chama tela para seleção da empresa que por sim chama a tela de menu principal (que monta dinamicamente os itens par acesso aos módulos do sistema contratado).
O Cadastro do usuário possui um campo do tipo json com todas aplicações que tem acesso e quais funções internas pode utilizar (inclusão, deleção, alteração no caso de formulários).
Então na segurança tem 2 tabelas : Usuários e Aplicações. No código de cada aplicação eu tenho propriedades internas que determina os módulos a qual essa app pertence. Pode se dar acesso a um usuário determinando o módulo, acessando todas aplicações desse módulo, podendo depois excluir e/ou alterar aplicações e funções de acesso, como se pode dar acesso a aplicações aleatoriamente. Tudo fica dentro de um único campo to tipo json (https://mariadb.com/kb/en/library/json-functions/).
Então não há cadastro de grupos de permissões, os módulos são pré-definidos. Isso facilita o cliente criar seus usuários de acesso e dar as permissões sem complexabilidade.
O uso de campos json evita criação de tabelas tipo grupos, grupos_x_usuarios, grupos_x_aplicações.
Como todas aplicações de módulos diferentes e sistemas diferentes estão publicados na mesma pasta fica tudo funcional. Um prod somente, um sistema de login e segurança único gerenciando sistemas diferentes com diversos módulos.
O Login possui uma opção de auto login, ou seja, uma vez habilitada, após o primeiro login, a app guarda com cookies os dados criptografados do usuário, no próximo login o sistema entra automático e vai direto para o menu principal da última empresa acessada. A troca de empresa se da por uma app no sistema (que recarrega o menu principal salvaguardando a empresa corrente e fechando todas as apps abertas antes da troca da empresa. O primeiro login do dia é obrigatório ele se torna automático partir do segundo login do dia. A opção para sair do sistema e forçar o login novamente.
O sistema todo está em 2 banco de dados:
- Master (gerencia meus contratos, suporte)
- Banco de dados do Sistema (erp, clinicas, veículos, escolas, suporte, etc) gerencia os dados dos clientes
Praticamente todas as regras de negócios estão no banco de dados (triggers, stored procedures, functions, events ‘a dar com pau’). Até os logs é o próprio banco quem cria, nada do lado da aplicação.
Em resumo, essa é a metodologia que aplico.