[Resolvido] hibernate + jaas multiempresa

11 respostas
B

Bom dia.

Não sei se estou no lugar certo, mas vamos lá.
Comecei a estudar hibernate + segurança com jaas, e até estão rodando 100% nos testes.
Tenho os usuarios cadastrados de teste, e conseguem se logar certinho no sistema.

Não tenho nenhum mapeamento, classe para o usuario, pois o jaas já faz toda a parte do login.
porém a minha duvida é a seguinte, como farei para separar os dados de clientes por empresa.

Tenho uma tabela de clientes com os seguintes campos:
idempresa / nome
1 / alberto
1 / maria
2 / pedro

e a tabela de usuarios com os seguintes campos:
idempresa / nome / senha
1 / joao / 123
2 / tiago / 123

como faço para quando o joao se logar só aparecer os clientes alberto e maria
e qndo o tiago se logar aparecer o cliente pedro

Utilizo banco de dados Postgres e JSF.

Se alguem puder me dar uma luz agradeço.

11 Respostas

T

Mas isso não tem nada a ver com autenticação. Você vai ter que criar filtros para buscar os clientes por determinado usuário. Na autenticação você so ira precisar da tabela usuario.

B

Certo… isso eu sei.
Mas como eu pego o idempresa do usuario quando ele se conectar?
como eu pego o idempresa=1 quando o usuario joao se logar no sistema.
Eu preciso pegar o idempresa pra mim fazer o filtro na lista de clientes.

select * from clientes
where idempresa=1

mesmo assim obrigado pela rapida resposta.

T

Vc esta trabalho com hibernate certo ?

Vc tem que buscar no banco depois que o usuário logar o objeto usuario passando, por exemplo, o login dele como parametro para o DAO (ou oq vc esteja usando para acessar a base de dados) .

B

beleza, já me deu um ponto inicial por onde começar.
Eu pensei que poderia pegar o idempresa direto ao se logar com o jaas, sem o uso de mais nada.
Muito obrigado.

Hebert_Coelho

Eu mostrei um modo de se fazer isso com filter nesse post: Validação de Login de Usuário com JSF e JAAS.

Qualquer outra dúvida, post aí. [=

B

jakefrog…
dei uma olhada em seu blog, muito bom por sinal.
e obrigado pela resposta também.

B

Essa é minha classe pessoaBean

package negocio;

import java.io.Serializable;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
 
import dominio.Pessoa;
import util.EntityManagerUtil;

@ManagedBean(name="pBean")
@ViewScoped
public class pessoaBean implements Serializable{
 
    private static final long serialVersionUID = 5173312796946661545L;
    private EntityManager entityManager;
    private Pessoa pessoa = new Pessoa();
    private Long id;
    private List<Pessoa> list = null;

    public String persist() {
        try {
            EntityTransaction transacao = getEntityManager().getTransaction();
 
            transacao.begin();
            getEntityManager().persist(pessoa);
            transacao.commit();
 
            newInstance();
            list = null;	            	            
            
            return "sucesso";
        } catch (Exception e) {
            e.printStackTrace();
            return "falhou";
        }
    }
 
    public String update() {
        try {
            EntityTransaction transacao = getEntityManager().getTransaction();
 
            transacao.begin();
            getEntityManager().merge(pessoa);
            transacao.commit();
 
            newInstance();
            
            return "sucesso";            
        } catch (Exception e) {
            e.printStackTrace();
            return "falhou";
        }
    }
 
    public String remove() {
        try {
            EntityTransaction transacao = getEntityManager().getTransaction();
 
            transacao.begin();
            getEntityManager().remove(pessoa);
            transacao.commit();
 
            newInstance();
            list = null;
 
            return "sucesso";
        } catch (Exception e) {
            e.printStackTrace();
            return "falhou";
        }
    }       
 
    @SuppressWarnings("unchecked")
    public List<Pessoa> getList() {
        if (list == null) {
            list = getEntityManager().createQuery("FROM Pessoa").getResultList();                         
        }
        return list;
    }
 
    public EntityManager getEntityManager() {
        if (entityManager == null) {
            entityManager = EntityManagerUtil.getInstance().createEntityManager();
        }
        return entityManager;
    }
 
    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
 
    public Pessoa getPessoa() {
        return pessoa;
    }
 
    public void setId(Long id) {
        this.id = id;
        if (id != null) {
            pessoa = getEntityManager().find(Pessoa.class, id);
        }
    }
 
    public Long getId() {
        return id;
    } 
    public void newInstance() {
        pessoa = new Pessoa();
    }

}
E essa é minha classe EntityManagerUtil.
package util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EntityManagerUtil {
    
	private static final EntityManagerUtil instance = new EntityManagerUtil();
    private static final EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("crud");
 
    private EntityManagerUtil() {
    	
    }
 
    public static EntityManagerUtil getInstance() {    	    	
    	return instance;
    }
 
    public EntityManagerFactory getEntityManagerFactory() {    	
    	return entityManagerFactory;
    }
 
    public EntityManager createEntityManager() {    	
    	return entityManagerFactory.createEntityManager();
    }
}

Devo criar uma nova classe para saber o IDEmpresa do usuário ao se logar?
Ou posso usar nessas mesmo.

Quero só saber por questões de estudos, pra realizar uns testes aqui.
Pegar o IDEmpresa, o nome do cliente e apresentar na aplicação e tudo mais.
Agradeço e fico no aguardo e possíveis dicas.

Hebert_Coelho

Por mim você pode. Se viu que no post lá eu usei um filter?

Basta vc utilizar um filter tb colocar o usuário na sessão e pronto.

B

Consegui jakefrog.
Acho que fiz uma coisa de amador profissional… :smiley: da uma olhada como ficou o código.

adicionei o seguinte código no meu pessoaBean.

private ExternalContext usuarioDaSessao() {
		FacesContext c = FacesContext.getCurrentInstance();
		ExternalContext user = c.getExternalContext();		
		return user;		
	} 
	
	public void pegaIDEmpresa() {
		String login = usuarioDaSessao().getUserPrincipal().getName(); //aqui pega o usuario da sessão.. o login.
		codempresa = (Integer) getEntityManager().createQuery("select idempresa FROM Usuario where nome_usuario='"+login+"'").getSingleResult(); // aqui faz um select na tabela de usuarios para pegar o código da empresa
	}

e no list ficou assim:

public List<Pessoa> getList() {
        if (list == null) {
            pegaIDEmpresa();
            list = getEntityManager().createQuery("FROM Pessoa where idempresa="+codempresa).getResultList(); //aqui fiz um select com um where IDEMPRESA na tabela de clientes para listar somente os clientes pertencentes aquela empresa
        }
        return list;
    }

funcionou, da maneira que eu queria.
mas sabes me informar se fiz um negócio meio feio?
se tem como melhorar isso?
agradeço.

Hebert_Coelho

Já que é para dar pitaco no código alheio… vamos lá:

nome método pegaIDEmpresa:

  1. Troca o nome para getIdEmpresa. Se acostume autilizar get/set no nome dos seus métodos pois tem muito framework que exige esse padrão.
  2. coloca um if (codempresa == null) aí faz a pergunta. Pq se não, toda hora que chamarem o método ele irá realizar a mesma consulta.
  3. ExternalContent não é o seu usuário da sessão não. E no seu código vc ta chamando de user… =P
  4. Estuda depois sobre padrão MVC. Vc separa melhor seus códigos em pacotes diferentes, com isso seu programa fica profissa.

Mas mano, é coisa que eu penso pode vir outra pessoa e discordar de tudo q eu falei e te dar opiniões melhores que as que eu te dei.

Qualquer coisa, tamo ae! [=

B

Muito obrigado pelas dicas.
já está rodando como eu queria.

Um abraço.
Feliz natal e ano novo. :smiley:

Criado 19 de dezembro de 2011
Ultima resposta 21 de dez. de 2011
Respostas 11
Participantes 3