Login JSF + PrimeFaces + JPA + MYSQL

Login

Sean bienvenidos a un nuevo artículo de la sección de JAVA, esta vez JAVA EE (Web), en el cual veremos como autenticar un usuario haciendo uso de JPA, PrimeFaces, JSF y una base de datos MYSQL, cabe decir que no utilizaremos ningún método de encriptación, ya que puede ser implementado por ustedes desde el backend en JAVA sin ningún problema, haciendo uso de las librerías de su gusto o método de encriptación deseado. empecemos:

Primero nuestra tabla en la base de datos:
tabla

Tenemos también nuestra pantalla de login:

Login

Nuestro proyecto debe tener la siguiente estructura e importar las librerías que aquí se pueden ver:
proyecto

Código del arhivo login.xhtml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
< ?xml version="1.0" encoding="UTF-8"?>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
< !DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:p="http://primefaces.org/ui"
     xmlns:f="http://xmlns.jcp.org/jsf/core">
     
    <h:head>
        <title>Login</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </h:head>
    <h:body>
        <p:growl id="growl" sticky="true" showDetail="true"></p:growl>
        <h:form>
            <p:panelgrid columns="2" style="position: absolute; top: 250px; left: 500px;">
                <f:facet name="header">Login Form</f:facet>
                <h:outputtext value=""></h:outputtext>
                <p:inputtext value="#{login.username}"></p:inputtext>
                <h:outputtext value=""></h:outputtext>
                <p:password value="#{login.password}"></p:password>
                <f:facet name="footer">
                    <p:commandbutton value="Login" action="#{login.loginControl()}"></p:commandbutton>
                </f:facet>
            </p:panelgrid>
        </h:form>
    </h:body>
</html>

Login Controller:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package com.controller;

import com.query.Query;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;

/**
*
* @author Ivan
*/

@ManagedBean(name="login")
@SessionScoped
public class LoginController implements Serializable {

private String username;
private String password;
private final Query query = new Query();
public String loginControl(){
if(query.loginControl(username, password)){
return "home.xhtml?faces-redirect=true";
}
RequestContext.getCurrentInstance().update("growl");
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Error de acceso"));
return "";
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}

Código de Query.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package com.query;

import com.entity.Login;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
*
* @author Ivan
*/

public class Query {
public Login l = null;
EntityManagerFactory emf;
EntityManager em;
public Query(){
emf = Persistence.createEntityManagerFactory("WebLoginPU");
em=emf.createEntityManager();
em.getTransaction().begin();
}
public boolean loginControl(String username, String password){
try {
l = em.createNamedQuery("Login.control", Login.class).setParameter("username", username).setParameter("password", password).getSingleResult();
if(l !=null){
return true;
}
return false;
} catch (Exception e) {
return false;
}
}
}

Nuestra entidad mapeada (Si no sabes como mapear tus tablas ni crear tu unidad de persistencia puedes pasarte por este vídeo.:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package com.entity;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

/**
*
* @author Ivan
*/

@Entity
@Table(name = "login")
@XmlRootElement
@NamedQueries({
@NamedQuery(name="Login.control", query="SELECT l FROM Login l WHERE l.loGin=:username AND l.pasSword=:password AND l.estado='1'"),
@NamedQuery(name = "Login.findAll", query = "SELECT l FROM Login l"),
@NamedQuery(name = "Login.findById", query = "SELECT l FROM Login l WHERE l.id = :id"),
@NamedQuery(name = "Login.findByLoGin", query = "SELECT l FROM Login l WHERE l.loGin = :loGin"),
@NamedQuery(name = "Login.findByPasSword", query = "SELECT l FROM Login l WHERE l.pasSword = :pasSword"),
@NamedQuery(name = "Login.findByEstado", query = "SELECT l FROM Login l WHERE l.estado = :estado")})
public class Login implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 255)
@Column(name = "loGin")
private String loGin;
@Size(max = 40)
@Column(name = "pasSword")
private String pasSword;
@Column(name = "estado")
private Boolean estado;

public Login() {
}

public Login(Integer id) {
this.id = id;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getLoGin() {
return loGin;
}

public void setLoGin(String loGin) {
this.loGin = loGin;
}

public String getPasSword() {
return pasSword;
}

public void setPasSword(String pasSword) {
this.pasSword = pasSword;
}

public Boolean getEstado() {
return estado;
}

public void setEstado(Boolean estado) {
this.estado = estado;
}

@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}

@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Login)) {
return false;
}
Login other = (Login) object;
if ((this.id == null &amp;&amp; other.id != null) || (this.id != null &amp;&amp; !this.id.equals(other.id))) {
return false;
}
return true;
}

@Override
public String toString() {
return "com.entity.Login[ id=" + id + " ]";
}

}
1
 

por ultimo el Home que no es más que una página con un mensaje de bienvenida

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
< ?xml version="1.0" encoding="UTF-8"?>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
< !DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>TODO supply a title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </head>
    <body>
        <div>TODO Bienvenido</div>
    </body>
</html>

Así mismo si estas en tus primeros pasos también puedes pasarte por este vídeo donde podrás ver como poner en marcha el servidor glassfish para hacer el despliegue de tus aplicaciones.
Hasta pronto!.