Arquitetura flexível para tratamento de perfis

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.

Desde já agradeço.

Abraços.

Minha sugestão é seguir o que a API te oferece: JAAS.

http://java.sun.com/javase/6/docs/technotes/guides/security/

Spring Security (antigo Acegi).

Caso você precise mudar o seu tipo de segurança, só mudar o provedor.

[]'s

Olá pessoal,

Agradeço as respostas.

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

Olá Sérgio, como vai?

Era algo assim que eu estava esperando. Estava pensando em algo parecido, mas pelo que você disse bem diferente.

Pensei em User>Roles>Perfil. Mas era apenas isso, onde User: Ana, Roles: Gerente Contas e Perfil: Abre/Fecha contas etc…

Pelo que você disse, isso não é flexível, só que não consegui ver onde encaixar as Funcionalidades embaixo dessa estrutura e nem por que não funcionaria.

Sem querer abusar, será que você poderia dar um exemplo.

Agradeço.

[quote=javaly]Olá Sérgio, como vai?

Era algo assim que eu estava esperando. Estava pensando em algo parecido, mas pelo que você disse bem diferente.

Pensei em User>Roles>Perfil. Mas era apenas isso, onde User: Ana, Roles: Gerente Contas e Perfil: Abre/Fecha contas etc…

Pelo que você disse, isso não é flexível, só que não consegui ver onde encaixar as Funcionalidades embaixo dessa estrutura e nem por que não funcionaria.

Sem querer abusar, será que você poderia dar um exemplo.

Agradeço.[/quote]

Entendí o que ele disse como sendo a mesma coisa que você disse… =/

Olá asaudate, como vai?

Então, foi assim que entendi, mas quando ele disse (“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.”) me passa a impressão de que dentro dos Perfis estaria um conjunto de permissões, como se o Perfil “Abre Conta” fosse composto por permissões e essas permissões é o que não estou conseguindo ver.

Abraço.

[quote=javaly]Olá asaudate, como vai?

Então, foi assim que entendi, mas quando ele disse (“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.”) me passa a impressão de que dentro dos Perfis estaria um conjunto de permissões, como se o Perfil “Abre Conta” fosse composto por permissões e essas permissões é o que não estou conseguindo ver.
[/quote]

O perfil “AbridouDeConta” necessita de permissões como : pesquisar contas, criar conta, editar conta ( ou conta: search, create, edit). As permissões são as ações que precisão ser liberadas para que a pessoa possa fazer as coisas. Veja que “FechadorDeConta” vai precisa de pesquisar e editar e fechar, mas não de criar. As combinações de permissões são infinitas em tese, mas apenas alguns conjuntos fazem sentido. Esses conjuntos são os perfis.
As permissões são usadas para controlar a visibilidade e usabilidade de botões, menus, etc… um botão e um menu que invocam a mesma operação estão protegidos pela mesma permissão.

Esqueci de dizer que é nos perfis que ha herança. Vc pode montar um perfil como a soma de outros perfis. Por exemplo um GerenciadorDeConta seria a soma de um abridor e um fechador. Mas da minha experiencia eu não recomendaria ter um esquema de herança de perfil do tipo arvore. Apenas uma funcionalidade que permite criar perfis importanto as permissões de outros.

P.S. Veja que no seu modelo PErfil = Abre/Fecha contas no meu seria Perfil1 = abridor, Perfisl2=Fechador
No seu perfil, o qu o perfil Abre/FEcha pode fazer ? no meu ele pode fazer as permissões que estiverem cadastradas para ele. O sistema não vai testar se o sujeito tem o perfil x ou y, ele vai testar se o sujeito tem a permissão X ou Y. mais do um perfil pode dar a mesma permissão.

Olá Sérgio, como vai?

Na verdade quando eu citei os perfis Abre/Fecha eu queria dizer que eram dois perfis, no caso, um que abriria e um que fecharia conta. No entanto, depois de ver seus exemplos vi que o modelo não é flexível, pois ficaria como se abrir ou fechar uma conta fossem funcionalidades e não perfis, perdendo assim essa flexibilidade que vc citou. Entendi bem o que você quis dizer no post anterior.

Obrigado pela explicação e pela ajuda.