Controle de permissões de acesso - Grails + Spring Security
09/01/2017 19:30
1
Olá pessoal,

Estou desenvolvendo uma aplicação e preciso implementar um esquema de permissões de acesso e não sei como fazer.

Segue a descrição de como quero que o sistema proceda:
Quando o usuário efetuar o cadastro informando o nome de sua empresa, o sistema cria um instância da empresa, um "role" de administrador para aquela empresa e o usuário com a "role" criada.

Essa "role" criada da permissão para esse usuário fazer tudo, porém o mesmo pode criar novas "roles", indicando que tipos de permissão tem para cada recurso do sistema, para que possam ser atribuídas aos demais usuários do sistema daquela empresa. Essas "roles" criadas devem estar apenas no escopo da empresa, ou seja, usuários de outras empresas não compartilham as mesmas "roles".

Dessa forma, podemos ver que temos como base as seguintes "domains": Empresa, Role, Usuário, UsuárioRole.

Vi que existe um plugin chamada Spring Security ACL que estende as funcionalidades Spring Security Core. Dei uma estudada nele, mas não consegui chegar na conclusão se ele consegue resolver o meu problema e como resolver.

Alguém sabe como resolver esse problema?

Obrigado pela ajuda.
Tags: Grails, Spring Security, Spring Security ACL, Permissões, Autorização


1
Oi Gustavo,

primeiro creio que é importante trabalhar um pouco no conceitual. A permissão (ROLE) não é algo que deva ser criado o tempo inteiro no sistema, pelo contrário: ela diz respeito a uma funcionalidade (ou conjunto de) do sistema que você está implementando. Sendo assim, não é interessante ficar incluindo novas permissões no sistema: este número normalmente (99,9999999999999%) das vezes é fixo.

Com base nisto, o que você vai ter é o relacionamento do Usuário com estas permissões. Por padrão inclusive, o Spring Security cria, nos scripts, uma classe de domínio chamada UserRole que faz justamente isto: relaciona o usuário com um conjunto de permissões.  Sendo assim, de acordo com o padrão, você terá três classes de domínio:

Usuario
Permissão
UsuarioPermissao (que faz o relacionamento)

No seu caso, a coisa é um pouco mais complexa: você quer que por empresa haja um conjunto de permissões. Ok, sem problema, basta você modelar o seu sistema realizando os relacionamentos necessários com as permissões desejadas. Uma configuração muito comum é a criação de perfis, na qual você associa a um perfil um número X de permissões e, na sequência, associa um usuário a N perfis, ficando com uma modelagem mais ou menos assim.

Perfil
Permissao
PerfilPermissao
Usuario
UsuarioPerfil

Aonde o UsuarioPerfil relaciona o usuário com os perfis, e os perfis, por sua vez, são associados a uma ou mais permissões. Como resultado, seu usuário teria acesso ao conjunto de permissões que compõem os perfis a que pertence.

Ok, como resolver isto. Primeiro é você montar uma modelagem similar à que apresentei acima. Na sequência, para descobrir as permissões do usuário, você terá de prover sua própria implementação da função getAuthorities(), que o Spring Security gera para a classe Usuario. Basta reescrevê-la de tal modo que retorne a lista de Permissoes apenas. Esta função deve retornar uma lista de objetos que implementem a interface GrantedAuthority (ou apenas objetos que tenham o atributo authority, como ele já faz por padrão).

Qualquer coisa estou aqui pra te ajudar.


0
Olá Henrique,

A sua explicação me fez entender uma parte da documentação do Spring Security que para mim era confuso. Essa parte é RoleGroup, RoleGroupRole e UserGroupRole.
Se eu tiver entendido bem, as classes de domínio que você citou são análogas as seguintes classes da documentação:
[list][/list]Com isso, no contexto da minha aplicação, o modelo de dados ficaria mais ou menos assim:
https://drive.google.com/file/d/0B-ud6e3hAoGTcmJLUVVwMVNueUE/view?usp=sharing

Dessa forma, minha aplicação teria diversos roles, um para cada funcionalidade, tipo: ROLE_CREATE_USER, ROLE_READ_USER, ROLE_DELETE_USER, etc.
Assim, quando o usuário criasse um perfil de acesso da empresa, o sistema criaria um RoleGroup, onde aponta para a empresa e diversas RoleGroupRole (uma para cada permissão).
Quando criasse um usuário, informaria os perfis, o que faria o sistema criar UserRoleGroup para cada perfil associado ao usuário.

O raciocínio é esse mesmo?

Obrigado pela ajuda.


0
Olá Henrique,

A sua explicação me fez entender uma parte da documentação do Spring  Security que para mim era confuso. Essa parte é RoleGroup, RoleGroupRole e UserGroupRole.

Se eu tiver entendido bem, as classes de domínio que você citou são análogas as seguintes classes da documentação:
   - Perfil -> RoleGroup
   - Permissao -> Role
   - PerfilPermissao -> RoleGroupRole
   - Usuario -> User
   - UsuarioPerfil -> UserRoleGroup

Com isso, no contexto da minha aplicação, o modelo de dados ficaria mais ou menos assim:
https://drive.google.com/file/d/0B-ud6e3hAoGTcmJLUVVwMVNueUE/view?usp=sharing

Dessa forma, minha aplicação teria diversos roles, um para cada funcionalidade, tipo: ROLE_CREATE_USER, ROLE_READ_USER, ROLE_DELETE_USER, etc.
Assim, quando o usuário criasse um perfil de acesso da empresa, o sistema criaria um RoleGroup, onde aponta para a empresa e diversas RoleGroupRole (uma para cada permissão).
Quando criasse um usuário, informaria os perfis, o que faria o sistema criar UserRoleGroup para cada perfil associado ao usuário.

O raciocínio é esse mesmo?

Obrigado pela ajuda.


0
Gustavo, é exatamente isto.

O único ponto que você vai ter de quebrar um pouco a cabeça é na escrita da consulta que te retorna as roles. Do resto, tá certinho, é nesta direção mesmo.
Qualquer coisa, já sabe: estamos aqui pra ajudar!


0
"??(...) você terá de prover sua própria implementação da função getAuthorities(), que o Spring Security gera para a classe Usuario. Basta reescrevê-la de tal modo que retorne a lista de Permissoes apenas. Esta função deve retornar uma lista de objetos que implementem a interface GrantedAuthority (ou apenas objetos que tenham o atributo authority, como ele já faz por padrão)"

Eu achei interessante essa ideia de organizar as roles por intermédio do "perfil". Se customizar a função getAuthorities() as anotações e a taglib do spring-security continuarão funcionando?

Eu tenho sofrido demaisssss pra editar arquivos dos plugins no grails 3.2 porque eles vem já em JAR. 
18/01/2017 15:23


0
Kico, sua resposta, como sempre, está ótima. Mas fiquei pensando no primeiro post do Gustavo, não seria o caso de ir pro lado do Multi Tenancy? Pois pelo que eu intendi o usuário vai cadastrar a sua empresa e iniciar como power user e os demais usuários estão atrelados à empresa. Isso não daria mais trabalho para escrever as consultas, pois seria Usuario -> Perfil -> Role -> Empresa 

Um abraço.



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto