Validation Login and Password Primeface and JSF

Asked

Viewed 1,127 times

1

I have a very simple system of Registration and Login, I made a validation in both fields.

I want to adapt this validation to something more specific like:

  • Login does not exist
  • Password invalidates

Currently my validation has a single return: "Invalid login or password"

Loginmanagedbean:

package br.com.arena.controller;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.arena.dao.PessoaDAO;
import br.com.arena.model.Pessoa;

@ManagedBean(name = "LoginMB")
@ViewScoped
public class LoginManagedBean {

    private PessoaDAO pessoaDAO = new PessoaDAO();
    private Pessoa pessoa = new Pessoa();

    public String envia() {

        pessoa = pessoaDAO.getPessoa(pessoa.getNomeUsuario(), pessoa.getSenhaUsuario());
          if (pessoa == null) {
              pessoa = new Pessoa();
                FacesContext.getCurrentInstance().addMessage(
                           null,
                           new FacesMessage(FacesMessage.SEVERITY_ERROR, "Login ou senha invalidos",
                                       "Erro no Login!"));
                return null;
          } else {
                return "/main";
          }


    }

    public PessoaDAO getPessoaDAO() {
        return pessoaDAO;
    }

    public void setPessoaDAO(PessoaDAO pessoaDAO) {
        this.pessoaDAO = pessoaDAO;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

}

Personal:

package br.com.arena.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import br.com.arena.model.Pessoa;
import br.com.arena.util.JPAUtil;

public class PessoaDAO {

    private EntityManager em;


    public PessoaDAO() {
        setEm(JPAUtil.getEntityManager());
    }

    public void cadastrar(Pessoa pessoa){
        getEm().getTransaction().begin();
        getEm().persist(pessoa);
        getEm().getTransaction().commit();
    }

    public void atualizar(Pessoa pessoa){
        getEm().getTransaction().begin();
        getEm().merge(pessoa);
        getEm().getTransaction().commit();
    }

    public List<Pessoa> listaTodasPessoas(){
        Query q = em.createQuery("select p from Pessoa p");     
        List<Pessoa> pessoas = q.getResultList();
        return pessoas;
    }

    public Pessoa getPessoa(String nomeUsuario, String senhaUsuario) {

        try {
            Pessoa pessoa = (Pessoa) em
                         .createQuery(
                                     "SELECT u from Pessoa u where u.nomeUsuario = :name and u.senhaUsuario = :senha")
                         .setParameter("name", nomeUsuario)
                         .setParameter("senha", senhaUsuario).getSingleResult();

              return pessoa;
        } catch (NoResultException e) {
              return null;
        }
  }

    public void removerPessoa(Pessoa pessoa){
        getEm().getTransaction().begin();
        getEm().find(Pessoa.class, pessoa.getId());
        getEm().remove(pessoa);
        getEm().getTransaction().commit();  
    }


    public EntityManager getEm() {
        return em;
    }
    public void setEm(EntityManager em) {
        this.em = em;
    }





}

Login.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>Arena</title>
</h:head>

<h:body>

    <h1>Login</h1>
     <h:form>
              <p:messages id="messages" />
              <p:panelGrid columns="2">
                    <p:outputLabel for="nomeUsuario" value="Nome Usuário:" />
                    <p:inputText id="nomeUsuario" value="#{LoginMB.pessoa.nomeUsuario}" />

                    <p:outputLabel for="senha" value="Senha:" />
                    <p:password id="senha" value="#{LoginMB.pessoa.senhaUsuario}" />

                    <p:commandButton value="Enviar" icon="ui-icon-star" action="#{LoginMB.envia}" ajax="false">
                    </p:commandButton>

              </p:panelGrid>
        </h:form>
</h:body>
</html>

2 answers

2

Good evening. I’d do it this way:

Bean:

import br.com.arena.dao.PessoaDAO;
import br.com.arena.model.Pessoa;

@ManagedBean(name = "LoginMB")
@ViewScoped
public class LoginManagedBean {
    // apoio 
    private String usuario = "";
    private String senha = "";

    private PessoaDAO pessoaDAO = new PessoaDAO();


    public String envia() {
       Pessoa pessoa = pessoaDAO.getPessoa(usuario);
          if (pessoa == null) {
                FacesContext.getCurrentInstance().addMessage(
                           null,
                           new FacesMessage(FacesMessage.SEVERITY_ERROR, "Login não existe",
                                       "Erro no Login!"));
                return "";
          } 

        if(!pessoa.getSenha().equals(senha)){
                FacesContext.getCurrentInstance().addMessage(
                           null,
                           new FacesMessage(FacesMessage.SEVERITY_ERROR, "Senha invalida",
                                       "Erro no Login!"));
        }

    }

    public PessoaDAO getPessoaDAO() {
        return pessoaDAO;
    }

    public void setPessoaDAO(PessoaDAO pessoaDAO) {
        this.pessoaDAO = pessoaDAO;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

}

DAO:

package br.com.arena.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import br.com.arena.model.Pessoa;
import br.com.arena.util.JPAUtil;

public class PessoaDAO {

    private EntityManager em;


    public PessoaDAO() {
        setEm(JPAUtil.getEntityManager());
    }

    public void cadastrar(Pessoa pessoa){
        getEm().getTransaction().begin();
        getEm().persist(pessoa);
        getEm().getTransaction().commit();
    }

    public void atualizar(Pessoa pessoa){
        getEm().getTransaction().begin();
        getEm().merge(pessoa);
        getEm().getTransaction().commit();
    }

    public List<Pessoa> listaTodasPessoas(){
        Query q = em.createQuery("select p from Pessoa p");     
        List<Pessoa> pessoas = q.getResultList();
        return pessoas;
    }

    public Pessoa getPessoa(String nomeUsuario) {

        try {
            Pessoa pessoa = (Pessoa) em
                         .createQuery(
                                     "SELECT u from Pessoa u where u.nomeUsuario = :name")
                         .setParameter("name", nomeUsuario).getSingleResult();

              return pessoa;
        } catch (NoResultException e) {
              return null;
        }
  }

    public void removerPessoa(Pessoa pessoa){
        getEm().getTransaction().begin();
        getEm().find(Pessoa.class, pessoa.getId());
        getEm().remove(pessoa);
        getEm().getTransaction().commit();  
    }


    public EntityManager getEm() {
        return em;
    }
    public void setEm(EntityManager em) {
        this.em = em;
    }

}

XHTML Arena

<h:body>

    <h1>Login</h1>
     <h:form>
              <p:messages id="messages" />
              <p:panelGrid columns="2">
                    <p:outputLabel for="nomeUsuario" value="Nome Usuário:" />
                    <p:inputText id="nomeUsuario" value="#{LoginMB.usuario}" />

                    <p:outputLabel for="senha" value="Senha:" />
                    <p:password id="senha" value="#{LoginMB.senha}" />

                    <p:commandButton value="Enviar" icon="ui-icon-star" action="#{LoginMB.envia}" ajax="false">
                    </p:commandButton>

              </p:panelGrid>
        </h:form>
</h:body>
</html>

Some remarks:

  1. *I didn’t test your code, I just modified it working *
  2. I separated the login properties from the person class
  3. I would also think of an encrypted password (MD5) for example

I hope I’ve helped.

1

Hello.

The idea is you separate the verification methods.

First check if the user exists (getPessoaPorUsuarioName), if it does not exist (Message: Invalid User).

If the user exists, check the password (getPessoaPorUsuarioNote) passing the valid user and password if it does not exist (Message: Invalid password)

If there is user and password, redirect to application.

Following example:

public String envia() {     
  pessoa  = pessoaDAO.getPessoaPorUsuario(getNomeUsuario()); 
  if (pessoa != null) { //usuario encontrado
      pessoa = null; //limpa objeto
      pessoa = pessoaDAO.getPessoaPorUsuarioSenha(getNomeUsuario(), getSenhaUsuario());
      if(pessoa != null) { //senha válida
          return "/main"; //redireciona para aplicação
      }
      else {
          //2ª verificação
          mostraMensagemErro("Senha inválida!");
          return null;            
      }
  } else {
      //1ª verificação
      mostraMensagemErro("Usuário inválido!");
      return null;        
  }
}

public void mostraMensagemErro(String mensagem){
    FacesContext.getCurrentInstance().addMessage(
            null,
            new FacesMessage(FacesMessage.SEVERITY_ERROR, mensagem,
                        "Erro no Login!"));
}

I hope I’ve helped.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.