SOS Java! JSF + Spring Security em Sistema de Login

3 respostas
DiogoLPJ

Oi pessoal,
Sou novo aqui e comecei a lidar com java a fundo bem recentemente, mas estou encarando uma dificuldade tremenda no momento. Se puderem me ajudar, agradeceria muito!

Estou tentando implementar um sisteminha de login + Chat rústico, aonde usei o Spring Security para validar o login do usuário, e o JSF para fazer o chat. Agora estou precisando resgatar o usuário que realizou o “login” para que dessa forma eu possa mostrar seu nome no título de boas vindas do chat (o parâmetro, se estabelecido no login, precisa ser levado para outra janela. Pois é nela em que o chat vai abrir) e também preciso fixar esse usuário para quando for gravar as mensagens. Dessa maneira, o usuário não vai precisar ficar digitando seu nome a toda nova mensagem que enviar (estou usando somente uma tabela no mysql que grava as mensagens, com seu respectivo usuário, ID da mensagem, e, caso haja um direcionamento específico, o “para” da mensagem), e outra tabela somente para login de usuário.

Peguei alguns códigos que lidavam especificamente a biblioteca do spring e spring security, mas não as entendi muito bem.

Alguém poderia me dizer como posso resgatar esse usuário “perdido”?

Segue meu ManagerBean e o a página do chat:

ManagerBean das Mensagens:

package manager;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import persistence.MensagemDao;
import entity.Mensagem;
public class ManagerBeanMensagem {
	
	private Mensagem mensagem;
    private List <Mensagem> listamensagem;
    
	public List<Mensagem> getListamensagem() {
		try{
		listamensagem= new MensagemDao().findAll();
		}catch(Exception e){
		}
		return listamensagem;
	}

	public void setListamensagem(List<Mensagem> listamensagem) {
		this.listamensagem = listamensagem;
	}

	public ManagerBeanMensagem() {
		mensagem = new Mensagem();
	}
	
	public Mensagem getMensagem() {
		return mensagem;
	}

	public void setMensagem(Mensagem mensagem) {
		this.mensagem = mensagem;
	}
	
	public void cadastro(){
		
		FacesContext fc = FacesContext.getCurrentInstance();
		
		try{
			
			MensagemDao d = new MensagemDao();
			d.create(mensagem);
			
			mensagem = new Mensagem();
			
			fc.addMessage("form1", new FacesMessage("Dados gravados"));
		}
		catch(Exception e){
			fc.addMessage("form1", new FacesMessage(e.getMessage()));
		}
		
	}
	
	 
}

ManagerBean do usuário:

package manager;

import java.io.Serializable;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

import entity.Usuario;

public class UsuarioController implements Serializable { 
	      
	private static final long serialVersionUID = 1L;
		private Usuario usuario;  
		
	    public UsuarioController(){  
	        usuario = new Usuario();  
	        SecurityContext context = SecurityContextHolder.getContext();  
	        if(context instanceof SecurityContext)  
	        {  
	            Authentication authentication = context.getAuthentication();  
	            if(authentication instanceof Authentication)  
	            {  
	                 usuario.setUsername(((User)authentication.getPrincipal()).getUsername());  
	            }  
	        }  
	          
	    }  
	  
	    public Usuario getUsuario() {  
	        return usuario;  
	    }  
	  
	    public void setUsuario(Usuario usuario) {  
	        this.usuario = usuario;  
	    }  
	      
	//Nada dentro desse comment deu certo    
	    
	/**public String pegarUsuario(){
		
		UsuarioController uc = new UsuarioController();  
		
		String usuario = uc.getUsuario().getNome();
		
		return usuario; 
	}
	
	public String teste(){
		
		return usuario.getNome();
	}

	public Usuario teste2(){
		Authentication authentication = (Authentication) SecurityContextHolder.getContext().getAuthentication();   
        
        if(authentication != null){  
            Object obj = authentication.getPrincipal();  
              
            if (obj instanceof Usuario){  
                return (Usuario) obj;  
            }         
        }
		return usuario;
	}**/
	
}

Página do Chat (Frame aonde preciso exibir o nome do usuário):

<%@page import="org.hibernate.transaction.TransactionFactory.Context"%>
<%@page import="com.sun.faces.facelets.el.ContextualCompositeMethodExpression"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="rich" uri="http://richfaces.org/rich"%>

<f:view>
	
	<h:form id="form1">
	<rich:panel header="Bem vindo #{NOME_DO_USUARIO_LOGADO}">
		<h:panelGrid columns="3">
			<h:outputText value="Mensagem:"></h:outputText><h:outputText value="Para:"></h:outputText>
			<p>
			&lt;h:inputTextarea rows="5" cols="60" value="#{ManagerBeanMensagem.mensagem.mensagem}"&gt;&lt;/h:inputTextarea&gt;
			&lt;h:inputText value="#{ManagerBeanMensagem.mensagem.para}"&gt;&lt;/h:inputText&gt;
			&lt;h:commandButton action="#{ManagerBeanMensagem.cadastro}" value="Enviar"&gt;&lt;/h:commandButton&gt;

		&lt;/h:panelGrid&gt;
	&lt;/rich:panel&gt;
	&lt;/h:form&gt;	
		

&lt;/f:view&gt;

Desde já, agradeço!

3 Respostas

Hebert_Coelho

Não entendo muito do spring security, mas uma coisa eu sei que você pode fazer.

Coloque seu objeto usuario dentro do HttpSession.
session.put(“usuario”, usuario);

Lá na sua página você pode fazer: #{usuario.userName}

Ou então, você pode fazer igual nessa página aqui http://uaihebert.com/?p=836&page=8. Procure pelo UserMB.

DiogoLPJ

jakefrog:
Não entendo muito do spring security, mas uma coisa eu sei que você pode fazer.

Coloque seu objeto usuario dentro do HttpSession.
session.put(“usuario”, usuario);

Lá na sua página você pode fazer: #{usuario.userName}

Ou então, você pode fazer igual nessa página aqui http://uaihebert.com/?p=836&page=8. Procure pelo UserMB.

Fala jakefrog!

Obrigado pela resposta! Estou demorando pois estou testando, pensando e tentando pesquisar também…mas até o momento não saiu nada.

Você consegue me dar um exemplo rápido colocando os códigos básicos e aonde vc está colocando-o?

Depois de ter pesquisado um pouco, temo que tenha de fazer tudo com servlet ou então fazer usando FacesContext, o que é meio obscuro pra mim…

Obrigado novamente!

DiogoLPJ

Consegui aqui!

Foi só questão de criar esse ManagerBean:

package Controller;
 
import Model.Usuario;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
 
@ManagedBean
@SessionScoped
public class UsuarioController implements Serializable {
 
    private Usuario usuario;
 
    public UsuarioController() {
        usuario = new Usuario();
        SecurityContext context = SecurityContextHolder.getContext();
        if (context instanceof SecurityContext){
            Authentication authentication = context.getAuthentication();
            if (authentication instanceof Authentication){
                usuario.setUsername(((User)authentication.getPrincipal()).getUsername());
            }
        }
    }
 
    public Usuario getUsuario() {
        return usuario;
    }
 
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
 
}

O que diferencia é a notação SessionScoped, que torna-a um escopo de sessão! E depois fazer os ajustes chamando primeiro por ela, e depois pelo objeto!

Peguei nessa webpage: http://jamacedo.com/2011/01/crud-jsf-2-parte-3-seguna-com-spring-security-3/

Creio que foi recomendada em algum momento aqui no fórum também.

Mas em todo caso, agora só falta gravar direitinho no Banco de Dados.

Obrigadão!!!

Criado 22 de março de 2012
Ultima resposta 22 de mar. de 2012
Respostas 3
Participantes 2