[quote=javaly]Saudações,
Estou por iniciar um projeto onde vamos precisamos de um tratamento de perfis bem flexível. Do tipo em que os sistema terá muitos usuários, com diferentes tipos de perfis, no entanto com muitas funcionalidades em comum entre esses perfis. Também tem perfis que parecem herdar de outros e especializa algumas funcionalidades. Quero criar uma forma bem flexível para tratar isso e gostaria de poder contar com a ajuda de vocês, seja com dicas, indicações de materiais, livros… ou qualquer meio que trate do assunto.
[/quote]
Primeiro tenho que dizer que isso não é um problema de arquitetura e sim de design.
Segundo esqueça JAAS num primeiro momento.
O mecanismo mais flexivel é o seguinte:
Um sujeito (usuário, sistema) tem um conjunto de roles (papeis). Cada role tem um conjunto de perfis (profile). Cada perfil tem um conjunto de permissões.
sujeito = Quem
role = Responsabilidade
Perfil = Capacidade no sistema
A Ana tem o papel de Gerente de Conta. O Gerente de conta Precisa de abrir contas (Perfil = AccountOpener), fechar contas (Perfil = AccountCloser) , movimentar dinheiro em nome do cliente (Perfil = AccountTransferProxyOperator) e imprimir relatorio de XYZ (Perfil = XYZReportObserver)
Cada perfil é relacionado a um conjunto de permissões. No codigo vc coloca entraves baseado nessas permissões e faz checks do tipo
sujeito.hasPermission(permissaoDesejada).
Internamente isso itera nos perfis de cada role do sujeito. Se algum deles liberar essa permissão, o sujeito tem essa permissão.
Em termos de cadastro vc cadastro o sujeito (usuários ou sistemas externos) , vc cadastra os roles agrupando neles os perfis. cadastra os perfis agrupando as permissões. As permissões são fixa e dadas pelo sistema.
Associar as permissões directamente aos roles é bom para sistema muito simples,mas vira um caos gerencial nos cadastros. É bom apenas para quando a relação role-permissão é fixa. Em sistema sérios feitos para durar isso nunca é o caso. Em produtos então, é completamente impossivel.