LoginController

LoginController

Controla el acceso de los usuarios, debe implementar la interface SecurityInterface de avrbavoutils que controla las sesiones

Definir los atributos

    String username;
    String password;
    String rol = "client";
    String usernameSelected;
    Boolean recoverSession = false;
    Boolean userwasLoged = false;
    Boolean tokenwassend = false;
    String usernameRecover = "";
    String myemail = "@gmail.com";
    String mytoken = "";
    private Boolean loggedIn = false;

Método doLogin()

Valida el usuario y password. Se invoca el método usernameRecoveryOfSession(); de la interfaz que devuelve el nombre del username que esta en una sesion actual en el navegador, si este es vacío se indica el false al atributo recoverSession. Se invoca el dialogo sessionDialog que esta definido en index.xhtml.

  usernameRecover = usernameRecoveryOfSession();
  recoverSession = !usernameRecover.equals("");
  if (recoverSession) {
      RequestContext.getCurrentInstance().execute("PF('sessionDialog').show();");
      return "";
  }

Se verifica si el usuario esta logeado en otra sesión invocando al método isUserLogged() de la Interface

if (recoverSession && usernameRecover.equals(username)) {

            } else {

                if (isUserLogged(username)) {
                    userwasLoged = true;
                    JsfUtil.warningMessage("(Existe) un usuario logeado en este momento con ese username " + username);
                    return "";
                }

            }

Guardar el usuario en la sesión

Se verifica que sea un usuario valido y se invoca el método saveUserInSession(username,segundos_vida_sesion), para guardar el username en la sesión. Se debe indicar la cantidad de segundos que estará activa la sesión por defecto sera 35 minutos, también el método almacena de manera automática mediante detección el ip, browser y la hora de inicio de sesión.

Al invocar save

 if (isUserValid()) {

                saveUserInSession(username, 300);
                // saveUserInSession(username, 2100);

                loggedIn = true;
                return rol;
                //return "admin";
            } else {
                JsfUtil.warningMessage("Usuario no valido");
            }

isUserValid()

En este método validamos contra una base de datos , colección u otro contenedor los datos del usuario, para verificar si es un usuario valido para accesar el sistema.

 private Boolean isUserValid() {
        Boolean isvalid = false;
        try {
            //Aqui se valida contra la base de datos
            if (username.isEmpty() || username.equals("") || username == null) {
                JsfUtil.warningMessage("Ingrese un usuario");
                return false;
            }
            if (password.isEmpty() || password.equals("") || password == null) {
                JsfUtil.warningMessage("Ingrese el password");
                return false;
            }
            if (password.equals("demo")) {
                return true;
            }

        } catch (Exception e) {
            JsfUtil.errorMessage("userValid() " + e.getLocalizedMessage());
        }
        return isvalid;
    }// </editor-fold>

doLogout()

Se invoca al cerrar la sesión. El método logout() de SecurityInterfaz termina la sesión y devuelve el llamado al url especificado.

 public String doLogout() {
        return logout("/seguridad/faces/index.xhtml?faces-redirect=true");

    }

sendToken()

Envia el Token del usuario en la sesion al correo electrónico del usuario

Se debe agregar que se valide si coincide el correo del usuario con el proporcionado.

Se obtiene el token del metodo getTokenOfUsername(username); de SecurityInterface.

Crear un objeto ManagerEmail managerEmail = new ManagerEmail(); y enviar el email mediante

managerEmail.send(myemail, "Token de seguridad", texto, "emailaplicacionenvia@gmail.com", "mypasswordemail")

Recuerde que si utiliza una cuenta de gmail para enviar correos debe habilitar en las politicas de seguridad el acceso desde otras aplicaciones.

Solo para Enviar emails desde Gmail.

https://myaccount.google.com/lesssecureapps?rfn=27&rfnc=1&eid=-6680523284104394687&et=0&asae=2&pli=1

Codigo:

  public String sendToken() {
        try {

//            if(!myemail.equals("emailusuario")){
//                //no es el email del usuario
//            }
            ManagerEmail managerEmail = new ManagerEmail();
            String token = tokenOfUsername(username);
            if (!token.equals("")) {

                String texto = "Token para iniciar sesion: " + token + "\r\n " + "Copie este en el sistema y haga clic en el boton Invalidar Sesion por Token";
                if (managerEmail.send(myemail, "Token de seguridad", texto, "aristides.netbeans@gmail.com", "passwordemail")) {
                    JsfUtil.successMessage("Se envio el token a su correo " + myemail + "");
                    tokenwassend = true;
                } else {
                    JsfUtil.warningMessage("No se pudo enviar el email con el token");
                }
            } else {
                JsfUtil.warningMessage("No hay token asignado al usuario:  " + username);
            }

        } catch (Exception e) {
            JsfUtil.errorMessage("sendToken() " + e.getLocalizedMessage());
        }
        return "";
    }

destroyByUser()

Destruye la sesion del usuario

public String destroyByUser() {
        try {
            if (isUserValid()) {
                userwasLoged = !destroyByUsername(username);
                if (!userwasLoged) {
                    JsfUtil.successMessage("Fue destruida la sesion puede ingresar al sistema");
                } else {
                    JsfUtil.successMessage("No fue destruida la sesion no puede ingresar al sistema");
                }
            } else {
                JsfUtil.warningMessage("Los datos del usuario no son validos");
            }
        } catch (Exception e) {
            JsfUtil.errorMessage("destroyByUser() " + e.getLocalizedMessage());
        }
        return "";
    }

destroyWithToken()

Se utiliza para destruir una sesión con el Token enviado al correo del usuario. Se debe invocar destroyWithToken(username, mytoken).

Vista:

Codigo

 public String destroyByToken() {
        try {
            if (isUserValid()) {
                userwasLoged = !destroyByToken(username, mytoken);

            } else {
                JsfUtil.warningMessage("Los datos del usuario no son validos");
            }
        } catch (Exception e) {
            JsfUtil.errorMessage("loginWithToken() " + e.getLocalizedMessage());
        }
        return "";
    }

invalidarActual()

Invalida la sesión actual mediante el método invalidateMySession() de SecurityInterface

  public String invalidateCurrentSession() {
        try {
            if (invalidateMySession()) {
                JsfUtil.successMessage("Sesion actual invalidada exitosamente");
            } else {
                JsfUtil.warningMessage("No se pudo invalidar la sesion actual");
            }

        } catch (Exception e) {
            JsfUtil.successMessage("invalidarActual() " + e.getLocalizedMessage());
        }
        return "";
    }

saludar()

Es un método que envía un mensaje saludando al usuario.

public String saludar() {
        JsfUtil.successMessage("Hola " + username + " a las " + JsfUtil.getTiempo());
        return "";
    }

Codigo completo

/*
 * 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.avbravo.seguridad;

import com.avbravo.avbravosecurity.SecurityInterface;
import com.avbravo.avbravoutils.JsfUtil;
import com.avbravo.avbravoutils.email.ManagerEmail;

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.primefaces.context.RequestContext;

/**
 *
 * @author avbravo
 */
@Named
@SessionScoped
public class LoginController implements Serializable, SecurityInterface {

    private static final long serialVersionUID = 1L;
    String username;
    String password;
    String rol = "client";
    String usernameSelected;
    Boolean recoverSession = false;
    Boolean userwasLoged = false;
    Boolean tokenwassend = false;
    String usernameRecover = "";
    String myemail = "@gmail.com";
    String mytoken = "";

    private Boolean loggedIn = false;

    // <editor-fold defaultstate="collapsed" desc="get/set"> 
    public String getMyemail() {
        return myemail;
    }

    public void setMyemail(String myemail) {
        this.myemail = myemail;
    }

    public Boolean getTokenwassend() {
        return tokenwassend;
    }

    public void setTokenwassend(Boolean tokenwassend) {
        this.tokenwassend = tokenwassend;
    }

    public String getRol() {
        return rol;
    }

    public void setRol(String rol) {
        this.rol = rol;
    }

    public String getMytoken() {
        return mytoken;
    }

    public void setMytoken(String mytoken) {
        this.mytoken = mytoken;
    }

    public String getUsernameSelected() {
        return usernameSelected;
    }

    public void setUsernameSelected(String usernameSelected) {
        this.usernameSelected = usernameSelected;
    }

    public Boolean getLoggedIn() {
        return loggedIn;
    }

    public void setLoggedIn(Boolean loggedIn) {
        this.loggedIn = loggedIn;
    }

    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;
    }

    public Boolean getUserwasLoged() {
        return userwasLoged;
    }

    public void setUserwasLoged(Boolean userwasLoged) {
        this.userwasLoged = userwasLoged;
    }

    // </editor-fold>
    /**
     * Creates a new instance of Login
     */
    public LoginController() {
    }

    @PostConstruct
    public void init() {

        loggedIn = false;
        recoverSession = false;
        userwasLoged = false;
        tokenwassend = false;

    }

    @PreDestroy
    public void destroy() {

    }
// <editor-fold defaultstate="collapsed" desc="doLogin"> 

    public String doLogin() {
        try {
            userwasLoged = false;
            tokenwassend = false;
            loggedIn = false;
            //aqui

            usernameRecover = usernameRecoveryOfSession();
            recoverSession = !usernameRecover.equals("");
            if (recoverSession) {
                RequestContext.getCurrentInstance().execute("PF('sessionDialog').show();");
                return "";
            }

            if (recoverSession && usernameRecover.equals(username)) {

            } else {

                if (isUserLogged(username)) {
                    userwasLoged = true;
                    JsfUtil.warningMessage("(Existe) un usuario logeado en este momento con ese username " + username);
                    return "";
                }

            }

            if (isUserValid()) {

                saveUserInSession(username, 300);
                // saveUserInSession(username, 2100);

                loggedIn = true;
                return rol;
                //return "admin";
            } else {
                JsfUtil.warningMessage("Usuario no valido");
            }
        } catch (Exception ex) {
            JsfUtil.errorMessage("doLogin() " + ex.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="isUserValid"> 
    /**
     * verifica si es valido el usuario
     *
     * @return
     */
    private Boolean isUserValid() {
        Boolean isvalid = false;
        try {
            //Aqui se valida contra la base de datos
            if (username.isEmpty() || username.equals("") || username == null) {
                JsfUtil.warningMessage("Ingrese un usuario");
                return false;
            }
            if (password.isEmpty() || password.equals("") || password == null) {
                JsfUtil.warningMessage("Ingrese el password");
                return false;
            }
            if (password.equals("demo")) {
                return true;
            }

        } catch (Exception e) {
            JsfUtil.errorMessage("userValid() " + e.getLocalizedMessage());
        }
        return isvalid;
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="doLogout"> 

    public String doLogout() {
        return logout("/seguridad/faces/index.xhtml?faces-redirect=true");

    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="sendToken()"> 
    public String sendToken() {
        try {

//            if(!myemail.equals("emailusuario")){
//                //no es el email del usuario
//            }
            ManagerEmail managerEmail = new ManagerEmail();
            String token = tokenOfUsername(username);
            if (!token.equals("")) {

                String texto = "Token para iniciar sesion: " + token + "\r\n " + "Copie este en el sistema y haga clic en el boton Invalidar Sesion por Token";
                if (managerEmail.send(myemail, "Token de seguridad", texto, "MY_EMAIL@gmail.com", "MYPASSWORD")) {
                    JsfUtil.successMessage("Se envio el token a su correo " + myemail + "");
                    tokenwassend = true;
                } else {
                    JsfUtil.warningMessage("No se pudo enviar el email con el token");
                }
            } else {
                JsfUtil.warningMessage("No hay token asignado al usuario:  " + username);
            }

        } catch (Exception e) {
            JsfUtil.errorMessage("sendToken() " + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>

// </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="destroyByUser()"> 
    public String destroyByUser() {
        try {
            if (isUserValid()) {
                userwasLoged = !destroyByUsername(username);
                if (!userwasLoged) {
                    JsfUtil.successMessage("Fue destruida la sesion puede ingresar al sistema");
                } else {
                    JsfUtil.successMessage("No fue destruida la sesion no puede ingresar al sistema");
                }
            } else {
                JsfUtil.warningMessage("Los datos del usuario no son validos");
            }
        } catch (Exception e) {
            JsfUtil.errorMessage("destroyByUser() " + e.getLocalizedMessage());
        }
        return "";
    }
// </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="destroyWithToken()"> 

    public String destroyByToken() {
        try {
            if (isUserValid()) {
                userwasLoged = !destroyByToken(username, mytoken);

            } else {
                JsfUtil.warningMessage("Los datos del usuario no son validos");
            }
        } catch (Exception e) {
            JsfUtil.errorMessage("loginWithToken() " + e.getLocalizedMessage());
        }
        return "";
    }
// </editor-fold>

    public String saludar() {
        JsfUtil.successMessage("Hola " + username + " a las " + JsfUtil.getTiempo());
        return "";
    }
// <editor-fold defaultstate="collapsed" desc="invalidateCurrentSession"> 

    public String invalidateCurrentSession(){
        try {
            if (invalidateMySession()) {
                JsfUtil.successMessage("Sesion actual invalidada exitosamente");
            } else {
                JsfUtil.warningMessage("No se pudo invalidar la sesion actual");
            }

        } catch (Exception e) {
            JsfUtil.successMessage("invalidarActual() " + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>
}

Last updated