dúvida Autenticação

Galera, estou fazendo a autenticação do sistema e estou com uma dúvida.
Na minha classe LoginAction chamo o método da minha classe DAO pra verificar se o usuário existe no sistema.

public String execute(){
		if(this.usuarioDAO.cadastrado(this.usuario)){
			this.usuario = this.usuarioDAO.getUsuarioBanco();
			this.campoSenha = UsuarioAction.criptografaSenha(this.campoSenha);
			if(this.campoSenha.equals(this.usuario.getSenha())){
				return SUCCESS;
			}
		}
		
		return "input";
	}

Na minha classe DAO faço uma consulta no banco pra ver se o usuário existe.

public class UsuarioDAO {
	
	private Usuario usuarioBanco;
	
	/**
	 * Verifica se o usuario existe
	 * @return true or false
	 */
	public boolean cadastrado(Usuario usuarioLogin) {
		List<Usuario> usuario = JPAUtil.getInstance().getList(Usuario.class, "SELECT u FROM Usuario u WHERE u.usuario = "+"'"+usuarioLogin.getUsuario()+"'");
		if(usuario.size() > 0){
			this.usuarioBanco = usuario.get(0);
		}
		return usuario.size() > 0;
	}

Minha dúvida é como pegar esse usuário na action.
Porque o método me retorna apenas true ou false.
Eu criei um atributo Usuario na DAO pra depois dar um get nele.
Mas não sei se essa é a melhor maneira de fazer.
Alguém tem outra idéia melhor?

nossa cara, isso ai n ta legal. Voce pode melhorar esse metodo cadastrado, primeiro renomeando ele, depois verificando se existe um usuario no banco com aquele login e senha do usuario passado como parametro. Essa consulta nao deve verificar o tamanho de uma lista, use algo getSingleResult da Query, concaternar strings como vc fez tb é terrível. Se o usuario existir vc pode retornar o usuario, caso contrario lançar uma exception

abrassssssssss

Uma criptografia na comparação da senha vai bem também!..

MD5, Hash, etc!

Ok galera, estou melhorando meu código de acordo com as sugestões que vcs passaram.
Porém, estou com 2 problemas:
1 - Estou usando este método para me trazer uma lista de usuários:

 /**
     * Busca uma lista de objetos
     * @param <T>
     * @param castClasse Classe do ojbeto a ser recuperado
     * @param jpql Query a ser processada
     * @param parametros Caso haja filtros na query
     * @return
     */
    public <T> List<T> getList(Class<T> castClasse, String jpql, Object... parametros) {
        List<T> toReturn = null;
        EntityManager em = getEntityManager();
        Query query = em.createQuery(jpql);
        for (int i = 0; i < parametros.length; i++) {
            query.setParameter(i + 1, parametros[i]);
        }
        toReturn = query.getResultList();
        em.getTransaction().commit();
        em.close();

        return toReturn;
    }

Daí quero fazer um metodo para me trazer apenas 1 usuário e não uma lista.
Mas eu não manjo mto de jpa e hibernate.
Alguém teria algum exemplo?

2 - Você disse pra não usar concatenção de String. Agora estou passando a string loginUsuario como parametro. Então a linha do código ficou assim:

List<Usuario> usuario = JPAUtil.getInstance().getList(Usuario.class, "SELECT u FROM Usuario u WHERE u.usuario = "+usuarioLogin);

Daí quando vou me logar, dá o seguinte erro:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'ohsbueno' in 'where clause'

Ele entende como o nome da coluna, não sei por que

amigo vc ainda está fazendo concatenação de string veja vc apenas retirou as aspas simples…

no seu usuarioDAO crie algo assim:

public Usuario buscaUsuario(Usuario usuario) {
   String hql = "SELECT u FROM Usuario u WHERE u.login = :login AND u.senha = :senha";
   Query q = entityManager.createQuery(hql);
   q.setParameter("login", usuario.getLogin());
   q.setParameter("senha", senha); // coloquei senha, pq talvez vc esteja a criptografando e jogando numa var...
   
   return (Usuario) q.getSingleResult();

}

entao na sua action pode existir algo como:

public String execute(){  
   try {
      this.usuario = usuarioDAO.buscaUsuario(usuario);
      return "SUCESSO";
   } catch(NoResultException ne) {
      return "ERRO";
   }
}

espero ter clareado suas idéias

/*edit

vc pode usar tanto o metodo createQuery quanto createNamedQuery ou até mesmo usar Criteria do hibernate

*/

abrasssssssss

Renan, eu não entendi essa linha

String hql = "SELECT u FROM Usuario u WHERE u.login = :login AND u.senha = :senha";

Quem é :login e :senha?

Porque ele tá recebendo o objeto Usuario como parametro e não string login e string senha.
Não é isso?

http://www.guj.com.br/posts/list/56714.java

[quote]andredecotia
http://www.guj.com.br/posts/list/56714.java
[/quote]

O que tem a ver esse post?

Chuvinha: ele passa como parâmetro o Usuario e o :login e :senha são parametros que ele carrega logo abaixo da linha do sql, tendeu?

alem do nome não consegui enxergar oq o link do nosso amigo andrecotia tem haver com esse topico, contexto totalmente diferente.

login e senha sao os parametros da sua query, note que logo abaixo chamo o metodo setParameter, para passar o valor dos mesmos pra query.

isso nao tem absolutamente nada haver com receber Strings ou Objetos como parametros do metodo

note que oque é passado pro metodo setParameter sao os tipos correspondentes dos atributos da classe

# q.setParameter("login", usuario.getLogin());  // o método getLogin retorna uma String mas ela poderia ter vindo como parametro do metodo entao ficaria assim: q.setParameter("login", variavelStringQueVeioDoMetodo);

// e a assinatura do metodo seria Usuario buscaUsuario(String variavelStringQueVeioDoMetodo, String senha)

q.setParameter("senha", senha); // coloquei senha, pq talvez vc esteja a criptografando e jogando numa var...  

cara acho que te colocaram num projeto meio complicado pra vc… aconselho dar uma desacelerada, ja deu uma olhadinha nas apostilas da caelum ?

abrassssssss

Entendi galera.
Porém, meu metodo está dando erro.
Minha action ficou assim:

public String execute(){ this.usuario.setSenha(UsuarioAction.criptografaSenha(this.campoSenha)); try { this.usuario = this.usuarioDAO.buscaUsuario(this.usuario); return SUCCESS; } catch (NoResultException e) { return "input"; } }

Minha DAO ficou assim:

public Usuario buscaUsuario(Usuario usuarioLogin) { Usuario usuario = JPAUtil.getInstance().getUsuario(usuarioLogin, "SELECT u FROM Usuario u WHERE u.login = :login AND u.senha = :senha"); return usuario; }

E minha JPA:

public Usuario getUsuario(Usuario usuario, String hql) { EntityManager entityManager = getEntityManager(); Query q = entityManager.createQuery(hql); q.setParameter("login", usuario.getUsuario()); q.setParameter("senha", usuario.getSenha()); return (Usuario) q.getSingleResult(); }

O erro que está dando é esse:

org.hibernate.QueryException: could not resolve property: login of: br.com.editorasaraiva.repositoriodigital.entity.Usuario [SELECT u FROM br.com.editorasaraiva.repositoriodigital.entity.Usuario u WHERE u.login = :login AND u.senha = :senha]

Eu estou fazendo alguma coisa de errado?

Sua entidade usuario tem o atributo login? a sua tabela no banco de dados tbm?

Ah…é isso
Não é login, o nome do campo é usuario.
Alterei essa linha para:

Usuario usuario = JPAUtil.getInstance().getUsuario(usuarioLogin, "SELECT u FROM Usuario u WHERE u.usuario = :usuario AND u.senha = :senha");

E tbm na jpa:

q.setParameter("usuario", usuario.getUsuario());

Agora funcionou.
Estou com uma apostila da caelum onde fala bastante de hibernate, vou aproveitar e dar uma estudada.
Muito obrigado galera =))

Abração