Como customizar usuario do sistema com UserDetailsService
14/05/2015 21:51
0
Boa noite galera, estou com o seguinte problema tenho que criar um usuário que tem vários atributos e esse tem suas permissões dentro do sistema, estou utilizando o Grails na versão 2.4.4 e o Plugin spring-security-core:2.0-RC4, meu problema está no fato de esse usuário ter diversos atributos e a classe geranda pelo s2-quickstart não aceita outros atributos, olhando a documentação vi um tal de  UserDetailsService, no entanto todos os tutoriais que pesquisei não foram satisfatórios e não consegui implementa-lo, gostaria de saber se alguém poderia me ajudar ?
Tags: spring-security-core


0
Fábio, no link abaixo tem as instruções e o código inicial, depois você pode customizar em cima.

http://grails-plugins.github.io/grails-spring-security-core/guide/userDetailsService.html
15/05/2015 08:06


0
Não ser vai te ajudar... particularmente eu não gosto de usar as classes geradas pelo s2-quickstart prefiro criar minha própria classe de domínio e depois eu crio um CustomAuthenticationProvider.. dai você pode fazer
montar a query e adicionar na sessão os dados que lhe for conveniente.
15/05/2015 08:35


0
É o seguinte Leandro Krukoski, eu já havia visto esse material da Custom UserDetailsService, no entanto algumas coisas não ficaram claras, meu inglês é ruim deve ser por isso, onde essas classes devem ficar localizadas ? 
15/05/2015 10:25


1
Vamos lá Fábio, você tem que fazer o seguinte.

1 - Criar dois serviços com os nomes MyUserDetails e MyUserDetailsService, eles vão ficar na pasta services da sua aplicação Grails.

2 - Na classe MyUserDetails  você define os parametros que quer passar no construtor. Exemplo Nome, Endereco.. o que você precisar. No link que te passei ele está adicionando um atributo fullName. (Vejo o código da classe MyUserDetails  do link).

3 - A classe MyUserDetailsService vai ter loadUserByUsername que vai criar uma instancia, observe que ele está fazendo a concatenação de (user.firstName + " " + user.lastName) para criar o fullname.

4 - Após isso você tem que ir no arquivo resources.groovy que está em grails-app/conf/spring/resources.groovy e adicionar o seu serviço, Veja o código abaixo, o (com.mycompany.myapp) vai ser substituído pelo pacote que você definir quando criar os serviços na etapa 1.
beans = { userDetailsService(com.mycompany.myapp.MyUserDetailsService)
}

Esse é os passos para adicionar 1 atributo fullName, 

Abraços
15/05/2015 10:45


0
Eu fiz exatemente como esta no exemplo sugerido e obtive o seguinte erro:

Error 2015-05-15 10:44:55,622 [localhost-startStop-1] ERROR context.GrailsContextLoaderListener  - Error initializing the application: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: identifier mapping has wrong number of columns: org.customAuth.security.MyUserDetails type: object
Message: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: identifier mapping has wrong number of columns: org.customAuth.security.MyUserDetails type: object
Line | Method
->>  262 | run in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|  615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^  745 | run in java.lang.Thread
Caused by BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: identifier mapping has wrong number of columns: org.customAuth.security.MyUserDetails type: object
->>  262 | run in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|  615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^  745 | run in java.lang.Thread
Caused by BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: identifier mapping has wrong number of columns: org.customAuth.security.MyUserDetails type: object
->>  262 | run in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|  615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^  745 | run in java.lang.Thread
Caused by MappingException: identifier mapping has wrong number of columns: org.customAuth.security.MyUserDetails type: object
->>  262 | run in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|  615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^  745 | run in java.lang.Thread
Error |
15/05/2015 10:48


0
OK leandro minha aplicação funcionou sem erros eu estava colocando a classe dentro do domain, no entanto agora como faço para criar as regras ?
15/05/2015 11:15


0
Dá uma olhada no meu arquivo Bootstrap.groovy:

import customauth.MyUserDetails

class BootStrap {

def init = { servletContext ->


def usuario = MyUserDetails(username:"fabio", password:"123", sexo:"M", endereco:"RUA X").save(flush: true)
def adminRole = Role.findOrCreateWhere(authority: "ROLE_ADMIN").save(flush: true)
UserRole.create usuario, adminRole, true
}
def destroy = {
}
}

Ai eu tenho o seguinte erro:
No signature of method: grails.util.Environment.MyUserDetails() is applicable for argument types: (java.util.LinkedHashMap)
15/05/2015 11:47


0
Então, 

Quando você instalou o plugin deve ter usado o s2-quickstart para iniciar suas classes de domínio. correto? Então você vai persistir essas classes no caso User, e Role se você seguiu o exemplo da documentação.Então no bootstrap você tem colocar a classe User.

O MyUserDetails vai ser utilizado automaticamente após o login do usuário, assim você vai conseguir acessar os dados adicionais do usuario.

Resumindo
1 - Usar o  s2-quickstart para criar as classes de dominio User e Role, 
2 - Adicionar os atributos que você precisa na User.
3 - Alterar os serviços MyUserDetails e MyUserDetailsService conforme falei no post anterior.

Da uma olhada nesse link em português, acho que vai te ajudar.

http://fabiodocarmo.com/2011/01/13/simplificado-spring-security-com-grails-versao-traduzida/

abraço
15/05/2015 13:24


0
Fábio,
  Estender a classe do springSecurity?
  Uso a classe springSecurity como foi gerada pelo quickstart e criei minha classe estendendo a do springSecurity, funciona que é uma beleza...
15/05/2015 14:04



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