Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dados do usuário logado não aparece na home, apenas na home!

Estou quebrando a cabeça para exibir os dados do usuário na Home da minha aplicação. Os dados podem ser vistos em qualquer outra url, mas quando visualizo a home some tudo, alguém pode me dizer onde estou errando? Segue a config:

    @Override
    public void configure(WebSecurity web) throws Exception {

        web.ignoring()
            .antMatchers("/assets/**", "/fonts/**", "/global/**", "/imagens/**", "/usuario/**", "/auth/**", "/usuario/**");
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
            .antMatchers("/", "/**").hasAnyAuthority("VISITANTE", "ADMIN", "ASSINANTE")
            .anyRequest().authenticated()
        .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
        .and()
            .logout()
            .logoutSuccessUrl("/login")
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .invalidateHttpSession(true)
            .deleteCookies("JSESSIONID")
        .and()
            .exceptionHandling().accessDeniedPage("/denied");
    }
4 respostas

Fala Clerman, tudo bem ?

Como você está tentando exibir os dados do usuário na página ? Coloca aqui como está o código das páginas pra darmos uma olhada.

Olá Rafael, segue meus arquivos:

@Override
    public void configure(WebSecurity web) throws Exception {

        web.ignoring()
            .antMatchers("/assets/**", "/fonts/**", "/global/**", "/imagens/**", "/usuario/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
            .antMatchers("/", "/**", "/fotos/**").hasAnyAuthority("VISITANTE", "ADMIN", "ASSINANTE")
            .anyRequest().authenticated()
        .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
        .and()
            .logout()
            .logoutSuccessUrl("/login")
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .invalidateHttpSession(true)
            .deleteCookies("JSESSIONID")
        .and()
            .exceptionHandling().accessDeniedPage("/denied");
    }

o controller para o login:

@RequestMapping(value = "/login", method = RequestMethod.GET)
    public ModelAndView login(Model model, String error, String logout) {

        if (error != null)
            model.addAttribute("error", "Login inválido, senha ou nome do usuário não confere.");

        if (logout != null)
            model.addAttribute("message", "Você foi deslogado com sucesso");

        return new ModelAndView("/login", "usuarioVar", model);
    }

    @RequestMapping(value = "/logout", method = RequestMethod.POST)
    public String logout(){

        return "redirect:/login";
    }

    @RequestMapping(value = "/denied", method = RequestMethod.GET)
    public ModelAndView acessoNegado(Model model){

        model.addAttribute("erro", "403");
        model.addAttribute("erroAdvise", "ACESSO NEGADO!");
        model.addAttribute("mensagem", "Você não tem permissão para acessar essa área.");

        return new ModelAndView("error", "mensage", model);
    }

usuarioLogado que extende user:

public class UsuarioLogado extends User{

    private Usuario usuario;

    public UsuarioLogado(Usuario usuario) {
        super(
                usuario.getEmail(),
                usuario.getSenha(),
                AuthorityUtils.createAuthorityList(usuario.getPerfil().toString()));

        this.usuario = usuario;
    }

    public Perfil getPerfil(){
        return usuario.getPerfil();
    }

    public Long getId(){

        return usuario.getId();
    }    

    public String getNome(){

        return usuario.getNome();
    }

}

usuarioDetailsService:

@Service
public class UsuarioLogadoDetailService implements UserDetailsService {

    private static final Logger LOG = Logger.getLogger(UsuarioLogadoDetailService.class);

    @Autowired
    private UsuarioService service;

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        Usuario usuario;

        try {
            usuario = service.findByEmail(username);
            LOG.info("Usuário encontrado (" + username + ").");
        } catch (Exception ex){
            LOG.error("Usuário não encontrado (" + username + ").");
            throw new UsernameNotFoundException("Usuário " + username + " não encontrado!");

        }
        return new UsuarioLogado(usuario);
    }

}

se precisar dos outros me fala, e obrigado por enquanto!

solução!

Fala Clerman, tudo bem ?

Na verdade gostaria de dar uma olhada no código das suas páginas, mas acho que dá pra tentar te ajudar mesmo assim.

O Spring Security provê uma forma fácil pra ter acesso ao usuário logado tanto no código Java como nas páginas JSP.

No controller: (exemplo)

public String suaAction(@AuthenticationPrincipal Usuario usuario) {
    ...    // usuario.getUsername(); 
}

Basta pedir via @AuthenticationPrincipal a referência do seu objeto, onde Usuario seria a implementação de UserDetails.

Nas páginas:

<%@taglib uri="http://www.springframework.org/security/tags"
                 prefix="sec"%>
...

<sec:authorize access="isAuthenticated()">
    <sec:authentication property="principal" var="user"/>
    <div>
        Olá ${user.name}
     </div>
</sec:authorize>

Você pode usar a taglib do Security pra ter esse suporte. A tag authorize te ajuda a renderizar trechos de página específicos pro contexto de segurança (apenas se o usuário está autenticado ou apenas se ele é um admin, por exemplo). Já a authentication te ajuda a acessar o objeto do usuário logado (o mesmo que pegamos no controller) podendo usar EL pra consumir os dados do usuário, ${usuario.nome} pra mostrar o nome do usuário logado na página, por exemplo.

Espero ter ajudado com algumas alternativas. Abraço!

Não poderia ser mais perfeito Rafael Rollo. Obrigado!