exibir informação de usuario com tag loggedInUserInfor
02/07/2012 15:16
0
Olá para todos novamente. Como posso pegar uma informação qualquer do usuario e exibir essa informação usando a tag <sec:loggedInUserInfo field="<Nome completo por exemplo>"

Segundo a documentação, eu deveria implementar UserDetailsService , e isto me retornaria uma instancia do usuario logado... eu fiz assim, de acordo com alguns exemplos que eu vi na internet.:


package groovy

import br.com.jambu.cge.Empresa
import br.com.jambu.cge.User

import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser
import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUserDetailsService;
import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

class CustomUserService implements GrailsUserDetailsService{

static final List NO_ROLES = [
new GrantedAuthorityImpl(SpringSecurityUtils.NO_ROLE)
]

@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {

User.withTransaction { status ->

User user = User.findByUsername(username)

if(!user){
throw new UsernameNotFoundException('Usuario não encontrado',username)
}

def authorities = user.authorities.collect {
new GrantedAuthorityImpl(it.authority)
}

def empresas = user.empresa.collect { new Empresa (it.empresa) }

return new GrailsUser(user.username, user.password, user.nome, user.celular, user.email, user.telefone, user.dataDeExpiracao, user.enabled, user.passwordExpired, user.accountExpired, user.accountLocked, authorities ?: NO_ROLES, user.id, empresas ?: null)
}
}

@Override
public UserDetails loadUserByUsername(String username, boolean loadRoles)
throws UsernameNotFoundException, DataAccessException {
return loadUserByUsername(username)
}
}



entretanto, quando tento acessar a página tenho o seguinte erro.:

Error executing tag <sec:ifLoggedIn>: Error executing tag <sec:loggedInUserInfo>: No such property: nome for class: org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser


O que estou fazendo errado? Obrigado :)
Tags: spring, security , segurança, plugin


0
Se não me engano, o problema desta tag é que ela usa como valor um objeto do tipo UserDetails do Spring Security, e não a classe que de fato representa a sua classe de domínio que é seu usuário.

No entanto, você consegue obter o nome do usuário. Da uma olhada no Javadoc desta classe:

Agora, usando o serviço de autenticação do próprio plugin você consegue acessar o nome deste seu usuário. Melhor ainda, todo controllador tem injetado um método chamado getAuthenticatedUser que vai retornar esta instancia pra você.


0
algo mais ou menos assim kiko.:

def nome = springSecurityService.currentUser.nome
[nome:nome]


e no gsp

Bem vindo, ${nome}


?
02/07/2012 16:50


0
Oi Márcio,

sim, esta é uma opção. Mas você pode usar diretamente o getAuthenticatedUser() do controlador também, assim sequer vai precisar ficar injetando serviços e tal, é mais direto.

Agora, pra saber mesmo como fazer, de uma forma quase fácil é dar uma olhada no código fonte da própria taglib, que pode ser acessado no seguinte diretório:

[diretório home do usuário]/.grails/[versão do seu grails]/projects/[seu projeto]/plugins/spring-security-core[versão do plugin].

Lá, você vai em grails-app/taglibs e vai dar de cara com ela. Dando uma olhada neste, percebi que a obtenção da instância que vai representar o usuário logado se da pela função abaixo:


protected determineSource() {
def principal = springSecurityService.principal

// check to see if it's a GrailsUser/GrailsUserImpl/subclass,
// or otherwise has a 'domainClass' property
if (principal.metaClass.respondsTo(principal, 'getDomainClass')) {
return principal.domainClass
}

principal
}


Então, o que acontece: se sua classe de domínio que representa o usuário for de fato uma classe de domínio, esta vai ser retornada (e o acesso ao atributo se dara diretamente). Caso contrário, você vai topar com uma instância de UserDetails, tal como mencionei no tópico acima.

Ai você só vai obter de utilidade pra view mesmo o método getUsername.



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