Vistas de página en total

jueves, 11 de diciembre de 2014

Inicio y Cierre de Sesion con Hibernate, JSF con Primefaces

Ahora en esta parte del blog hablare mas de lo que se necesita para un inicio de sesión y cierre de sesión de acuerdo tendremos que interactuar con nuestra interfaz o frondend de login al cual debe quedar así:

public interface FrondEndLogin {
    public boolean registerLogin(Session session, Login login) throws Exception;
    public Login updateLogin (int id) throws Exception;
    public Login deleteLogin (int id) throws Exception;
    public Login getByUserName(Session session, String name) throws Exception;
}

Modificamos el login Dao

public class loginDAO implements FrondEndLogin{
    private Session session;
   
    @Override
    public boolean registerLogin(Session session, Login login) throws Exception {
        session.save(login);//guardar los datos
        return true;
    }
    @Override
    public Login updateLogin(int id) throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    @Override
    public Login deleteLogin(int id) throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    @Override
    public Login getByUserName(Session session, String name) throws Exception {
        //creamos la sentencia HQL ojo no es lo mismo que SQL en el post lo explicare mas a fondo
        String hql = "from Login where user=:user";
        //creamos el query donde lo inicializamos con el session
        Query query = session.createQuery(hql);
        //agregamos al query el parametro de la consulta que se recibira desde el id que se le envie del Bean al DAO es la forma mas segura
        //para prevenir inyeccion sql
        query.setParameter("user", name);
        //pasamos a la consulta para ello instanciaremos el objeto Usuarios con el query dond solo obtendra un unico resultado
        Login login = (Login) query.uniqueResult();
        //retornamos
        return login;
    }
   
}


Para este caso crearemos un nuevo ManagedBean y debe quedar como el siguiente al cual implementamos 2 métodos el de iniciar sesión y cerrar sesión:

@ManagedBean
@SessionScoped
public class ManagedBeanSesionLogin implements Serializable{
    private String userName;
    private String userPass;
    private Login login;
    private Session session;
    private Transaction transaction;
   
    public ManagedBeanSesionLogin() {
    }
   
    public String beginSession(){
        /*inicializamos para asegurarnos*/
        session = null;
        transaction = null;
       
        try {
            /*instanciamos los objetos*/
             loginDAO daoLogin = new loginDAO();
             //abrimos sesion de conexcion
             session = HibernateUtil.getSessionFactory().openSession();
             //creamos la transaccion y la comenzamos
             transaction = session.beginTransaction();
             //intanciamos el objeto
             Login login = daoLogin.getByUserName(session, userName);
             //valida si es que existe el usuario
             if(login != null){
                 //valida que la contraseña sea la misma
                 if(login.getPass().equals(Encrypting.encrypting(userPass))){
                     //si todo es valido manda a la pagina
                     return "/User/viewAll";
                 }
             }          
             transaction.commit();//cerrar transaccion
             userName = null;
             userPass = null;
             //mandar mensaje de error de datos
             FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error de Acceso", "Datos Incorecctos"));
             //retornar
             RequestContext.getCurrentInstance().execute("cleanForm('loginForm')");
             return "/home";
        } catch (Exception e) {
            //verificamos sino hay ya una transaccion ya definida
            if(transaction != null){
                //si lo hay haremos que todo se revierta en la BD y que como estaba antes de utilizar este metodo
                transaction.rollback();
            }
             FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Error Fatal", "Contacte con su administrador "+e.getMessage()));
             login = new Login();
             return null;
        }finally{
            //verificamos sino hay ya una session ya definida
            if(session != null){
                //si lo hay cerramos la session
                session.close();
            }
        }
    }
    public String closeSession() {
        userName = null;
        userPass = null;
        return "/home";
    }
   
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPass() {
        return userPass;
    }
    public void setUserPass(String userPass) {
        this.userPass = userPass;
    } 


creamos en nuestra pagina que tengamos como inicio o index el formulario y es el siguiente en la parte del content del template:

         <h:form id="loginForm">
                    <p:growl id="growl" sticky="true" showDetail="true" life="3000" />
                        <p:dialog header="Iniciar Sesion INEE" modal="true" widgetVar="dlg" resizable="false" showEffect="explode" showHeader="explode">
                            <h:panelGrid columns="2" cellpadding="5">
                                <h:outputLabel for="username" value="Username:"/>
                                <p:inputText id="username" value="#{managedBeanSesionLogin.userName}" placeholder="Nombre de Usuario" required="true" label="username">
                                    <f:validator validatorId="ValidateEmptyFields"/>
                                </p:inputText>
                                <h:outputLabel for="password" value="Password:" />
                                <p:password id="password" value="#{managedBeanSesionLogin.userPass}" placeholder="Contraseña de Usuario" required="true" label="password" />
                            <f:facet name="footer">
                                <center><p:commandButton value="Iniciar" action="#{managedBeanSesionLogin.beginSession()}" update="loginForm"/></center>
                            </f:facet>
                            </h:panelGrid>
                        </p:dialog>
                </h:form>

Y en la parte top del template agregamos la siguiente linea:

                <h:outputLink value="javascript:void(0)" onclick="PF('dlg').show();" title="login">
                     <p:outputLabel  id="label1" value="Iniciar Sesion" style="color: white;"/>
                 </h:outputLink>

Entonces la pagina de inicio en mi proyecto es el siguiente obviamente aun es un diseño asi que falta para implementar pero solo es para mostrar, mas bien seria lo que llevamos hasta el momento de acuerdo:














1 comentario:

  1. buenas noches. una pregunta. si yo quiero crear 2 sesiones diferentes. una para usuarios, y otra para administrador como seria en este caso ??

    ResponderEliminar