Estendendo o Spring Security Core - Problema com Domain UserRole: Como não persistí-la?
13/09/2012 02:05
1
Apresentando-me: Depois de milhões de anos sem programar, estou amando esse tal do Grails e resolvi me arriscar a brincar um pouco com isso aqui...desculpem a falta de conhecimento...mas vai lá a dúvida:

Usando o plugin Spring Security Core, por padrao tenho uma classe Usuario outra Regra e a relação gerada UsuarioRegra.

Não quero associar usuario com regra e preciso estender isso...inicialmente...usando uma nova Domain: Perfil

Assim, tenho:

Usuario
...
static hasMany = [perfis:Perfil] ...}

Perfil
...
static hasMany = [regras:Regra, usuarios:Usuario]
static belongsTo = Usuario
...}

Regra
...
static hasMany = [perfis:Perfil]
static belongsTo = Perfil
...}

Até aqui, tudo perfeito (eu acho...rs)

Pelo q entendi até agora, para o Spring, na classe Usuario, há um método getAuthorities() Responsavel por trazer as autoridades (usuario_id, regra_id) que normalmente existiria em uma tabela mapeada na classe Domain UsuarioRegra gerada pelo Plugin.

FINALMENTE AS DUVIDAS:
Problema: Não quero ter a tabela no BD UsuarioRegra. Isso será resultado de uma relação que poderia ser obtida por exemplo na query SQL: "select regra_id from perfil_regras pr inner join usuario_perfis up on pr.perfil_id = up.perfil_id where up.usuario_id = <id do usuario>"

Pergunta:Se nas classes domain usei relações N x N com hasMany, e não existem as Domains das relações PerfilRegra e UsuarioPerfil, como escrevo o catzo da query acima em alguma forma para que o Domain Usuario.getAuthorities() possa obter as regras da relação N x N q eu criei?

P.S. Tentei fazer uma view no BD mas tendo uma classe domain UsuarioRegra, não consegui fazer com que ela não fosse persistida. O grails tenta criar ele no BD mesmo com transient nos atributos. Se eu conseguir q a classe UsuarioRegra nao seja persistida, ótimo, uso a view no BD pra representar a classe e detono os metodos de insert, etc...mas isso fica parecendo meio marreta. Como faço isso ficar bonito?

OBS. Escrevi tanto pq como sou meio burro nisso aqui, tenho q tentar detalhar pra tentar me expressar, espero que tenham paciencia de ler...rs.

Obrigado a todos e parabéns ao KIKO pelo trabalho na comunidade Grails.
Tags: Spring Security Query transient


0
Oi Maurício,

pelo que pude entender você está tentando obter a listagem de roles do usuário de uma forma que foge um pouco da tradicional, certo?

Bom: não sei se vai funcionar direito o que vou dizer, mas é uma tentativa: implemente a lógica do método getAuthorities do seu usuário de tal forma que seja aplicada esta lógica. No caso, você só vai precisar escrever esta sua consulta em algum outro lugar (um serviço, por exemplo) e chamá-lo. Com o resultado, basta retornar um Set com as instâncias da sua Role. Esta é uma alternativa.

Ah, e que bom que está gostando do trablaho que estou fazendo aqui. A idéia é tentar melhorar sempre!

Grande abraço!


0
Acho q to chegando perto...

Fiz o servico como recomendou com um metodo que percorre os atributos hasMany...

O problema é q qdo acesso no domain Usuario o atributo perfis - hasMany [perfis:Perfil] - essa lista possui os perfis porem nao instanciados...como faco para carregá-la com seus objetos preenchidos?
14/09/2012 00:23


1

Domain
...
Set<Regra> getAuthorities() {
usuarioRegraService.obterRegras(this) as Set
}
...

Servico:

package seguranca

class UsuarioRegraService {

def obterRegras(Usuario u) {
def l = []
u.perfis.each {p ->
p.regras.each {r ->
l << r
}
}
l
}
}

a lista u.perfis tem a qtde de perfis relacionados mas cada posicao nao esta instanciada....

Q !@#$#@% eu fiz? ou nao fiz....
14/09/2012 00:27


1
FUNCIONOU TUDO!!

Vamos lá:

Passo 1 - script basico do Spring Security s2-quickstart seguranca Usuario Regra
Passo 2 - criar a domain Perfil
Passo 3 - criar as relações m x n entre [Usuario e Perfil] e [Perfil e Regra] usando hasMany definindo o owner com belongsTo
Passo 4 - Detonar a Domain criada pelo SpringSecurity UsuarioRegra
Passo 5 - Criar um servico e neste um metodo recebendo por param o usuario logado para percorrer no usuario os perfis disponiveis e em cada perfil as regras, devolvendo uma lista. Ex:


class UsuarioRegraService {

def obterRegras(Usuario u) {

def l = []
u.perfis.each {p ->
p.regras.each {r ->
l << r
}
}
l
}
}


Passo 6 : Na Domain User, no método getAuthorities, chamar o metodo do servico:
Set<Regra> getAuthorities() {
usuarioRegraService.obterRegras(this) as Set
}

PRONTO! Assim, meu primeiro uso do Spring Security como teste fora do formato inicial do plugin, permitindo eu criar um primeiro agrupador de regras (perfil). Assim, nao preciso dar role diretamente para o usuario e poderemos evoluir isso para o modelo basico de um sistema de seguranca convencional com relações entre usuario x perfil x regra x sistema...e por ai vai!!!

MUITO OBRIGADO PELA FORÇA ao KIKO e a todos da comunidade GRails....

Obs. Vou melhorar a app e posto ela qdo estiver um pouco mais decente e quem sabe um pouco mais completa q nesse post.

14/09/2012 01:43


0
Que massa Maurício!

Puxa: eu pensei no negócio mais do ponto de vista teórico, você tacou na prática e o trem funfou!
Fenomenal!



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