Java tutorial
/* * Este programa es software libre; usted puede redistribuirlo y/o modificarlo bajo los trminos * de la licencia "GNU General Public License" publicada por la Fundacin "Free Software Foundation". * Este programa se distribuye con la esperanza de que pueda ser til, pero SIN NINGUNA GARANTIA; * vea la licencia "GNU General Public License" para obtener mas informacin. */ package ips1ap101.lib.core.control; import java.io.Serializable; import java.security.Principal; import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import javax.servlet.http.HttpServletRequest; import ips1ap101.lib.base.constant.CBM; import ips1ap101.lib.base.entity.enumeration.TipoFuncionEnumeration; import ips1ap101.lib.base.persistence.entity.ConjuntoSegmentoBase; import ips1ap101.lib.base.persistence.entity.ElementoSegmentoBase; import ips1ap101.lib.base.persistence.entity.FuncionBase; import ips1ap101.lib.base.persistence.entity.RolBase; import ips1ap101.lib.base.persistence.entity.RolFuncionBase; import ips1ap101.lib.base.persistence.entity.RolFuncionParBase; import ips1ap101.lib.base.persistence.entity.RolUsuarioBase; import ips1ap101.lib.base.persistence.entity.UsuarioBase; import ips1ap101.lib.base.util.BitUtils; import ips1ap101.lib.core.app.Bitacora; import ips1ap101.lib.core.app.TLC; import ips1ap101.lib.core.constant.EAC; import ips1ap101.lib.core.jsf.JSF; import ips1ap101.lib.core.util.EA; import ips1ap101.lib.core.web.app.EJBL; import org.apache.commons.lang.StringUtils; /** * @author Jorge Campins */ public class UsuarioAutenticado extends UsuarioActual implements Principal, Serializable { private static final String ROL_SUPER_GESTOR = "SuperGestor"; private static final String ROL_SUPER_LECTOR = "SuperLector"; private static final String ROL_OPERADOR = "Operador"; private static final String USUARIO_OPERADOR = "oper"; private static enum AutorizacionFuncion { NO_AUTORIZADA, AUTORIZADA, ACCESO_PERSONALIZADO } static String getPrincipalName() { Principal principal = JSF.getPrincipal(); return principal == null ? CODIGO_USUARIO_DESCONOCIDO : principal.getName(); } static boolean isUserInRoleSuperGestor() { return isUserInRole(ROL_SUPER_GESTOR); } static boolean isUserInRoleSuperLector() { return isUserInRole(ROL_SUPER_LECTOR); } static boolean isUserInRoleOperador() { return isUserInRole(ROL_OPERADOR); } static boolean isUserInRole(String role) { HttpServletRequest request = JSF.getRequest(); return request != null && request.isUserInRole(role); } private void stamp() { Bitacora.stamp(this); } /** * Creates a new instance of UsuarioAutenticado */ public UsuarioAutenticado() { super(); filterFragmentRendered = true; helpInlineRendered = true; filasPorPagina = 0; stamp(); clear(); } /** * Creates a new instance of UsuarioAutenticado */ UsuarioAutenticado(String codigo) { this(); if (codigo != null) { setCodigoUsuario(codigo); setNombreUsuario(StringUtils.capitalize(codigo)); } setCredencialesUsuario(); } private void clear() { funcionesAutorizadas.clear(); parametrosAutorizados.clear(); segmentosAutorizados.clear(); modificado = false; fechaHoraModificacion = getSessionCreationTime(); } /** * Conserva el valor de la propiedad filterFragmentRendered. */ boolean filterFragmentRendered; public boolean isFilterFragmentRendered() { return filterFragmentRendered; } public void setFilterFragmentRendered(boolean filterFragmentRendered) { this.filterFragmentRendered = filterFragmentRendered; } /** * Conserva el valor de la propiedad helpInlineRendered. */ boolean helpInlineRendered; public boolean isHelpInlineRendered() { return helpInlineRendered; } public void setHelpInlineRendered(boolean helpInlineRendered) { this.helpInlineRendered = helpInlineRendered; } /** * Conserva el valor de la propiedad filasPorPagina. */ int filasPorPagina; public int getFilasPorPagina() { return filasPorPagina; } public void setFilasPorPagina(int filasPorPagina) { this.filasPorPagina = filasPorPagina; } /** * Conserva el valor de la coleccin funcionesAutorizadas. */ private Set<FuncionAutorizada> funcionesAutorizadas = new LinkedHashSet(); /** * Getter para coleccin funcionesAutorizadas. * * @return Valor de la coleccin funcionesAutorizadas. */ Set<FuncionAutorizada> getFuncionesAutorizadas() { return funcionesAutorizadas; } /** * Conserva el valor de la coleccin parametrosAutorizados. */ private Set<ParametroAutorizado> parametrosAutorizados = new LinkedHashSet(); /** * Getter para coleccin parametrosAutorizados. * * @return Valor de la coleccin parametrosAutorizados. */ Set<ParametroAutorizado> getParametrosAutorizados() { return parametrosAutorizados; } /** * Conserva el valor de la coleccin segmentosAutorizados. */ private Set<SegmentoAutorizado> segmentosAutorizados = new LinkedHashSet(); /** * Getter para coleccin segmentosAutorizados. * * @return Valor de la coleccin segmentosAutorizados. */ Set<SegmentoAutorizado> getSegmentosAutorizados() { return segmentosAutorizados; } /** * Conserva el valor de la propiedad modificado. */ private boolean modificado; /** * Getter para propiedad modificado. * * @return Valor de la propiedad modificado. */ public boolean isModificado() { return modificado; } /** * Setter para propiedad modificado. * * @param modificado Nuevo valor de la propiedad modificado. */ public void setModificado(boolean modificado) { this.modificado = modificado; this.fechaHoraModificacion = modificado ? System.currentTimeMillis() : -1; } /** * Conserva el valor de la propiedad fechaHoraModificacion. */ private long fechaHoraModificacion; long getFechaHoraModificacion() { return fechaHoraModificacion; } /** * Getter para propiedad name. * * @return Valor de la propiedad name. */ @Override public String getName() { return getCodigoUsuario(); } /** * {@inheritDoc} */ @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj instanceof UsuarioAutenticado) { UsuarioAutenticado that = (UsuarioAutenticado) obj; if (this.getName().equals(that.getName())) { return true; } } return false; } /** * {@inheritDoc} */ @Override public int hashCode() { return super.hashCode(); } /** * {@inheritDoc} */ @Override public String toString() { return getCodigoUsuario() + "(" + getNombreUsuario() + ")"; } final void setCredencialesUsuario() { Bitacora.trace(getClass(), "setCredencialesUsuario", getCodigoUsuario()); track(false); clear(); UsuarioBase usuario = findUsuario(getCodigoUsuario()); if (usuario == null) { TLC.getBitacora().warn(CBM.USUARIO_NO_EXISTE, getCodigoUsuario()); usuario = findUsuario(USUARIO_OPERADOR); } if (usuario == null) { TLC.getBitacora().warn(CBM.USUARIO_NO_EXISTE, USUARIO_OPERADOR); } else { setIdUsuario(usuario.getIdUsuario()); setNombreUsuario(usuario.getNombreUsuario()); if (isUserInRoleSuperGestor() || isUserInRoleSuperLector() || isUserInRoleOperador()) { setFuncionesAutorizadas(usuario); } setLimiteArchivoDetalle(usuario.getLimiteArchivoDetalle()); setLimiteArchivoResumen(usuario.getLimiteArchivoResumen()); setLimiteInformeDetalle(usuario.getLimiteInformeDetalle()); setLimiteInformeResumen(usuario.getLimiteInformeResumen()); setLimiteInformeGrafico(usuario.getLimiteInformeGrafico()); } track(true); } private void setFuncionesAutorizadas(UsuarioBase usuario) { Long id; boolean esPublica; boolean esProgramatica; boolean esProtegida; boolean esPersonalizable; boolean esSegmentable; boolean esLectura; boolean esLecturaAutorizada; boolean esAutorizada; boolean esAccesoPersonalizado; AutorizacionFuncion autorizacion; Collection<? extends FuncionBase> funciones; Collection<? extends RolBase> roles; Collection<? extends ConjuntoSegmentoBase> conjuntos; Collection<? extends RolUsuarioBase> rolesPorUsuario; Collection<? extends RolFuncionBase> funcionesPorRol; FuncionAutorizada funcionAutorizada; funcionesAutorizadas.clear(); parametrosAutorizados.clear(); segmentosAutorizados.clear(); if (isUserInRoleSuperGestor()) { return; } funciones = Controlador.getFunciones(); if (funciones == null || funciones.isEmpty()) { return; } boolean dynrbac = EA.isDynamicAccess(); // roles = dynrbac ? null : EJBL.getRolFacade().findAll(true); roles = findRoles(); conjuntos = findConjuntos(); Bitacora.trace(EAC.RBAC + "=" + dynrbac); Bitacora.trace("roles=" + (roles == null ? null : roles.size())); Bitacora.trace("conjuntos=" + (conjuntos == null ? null : conjuntos.size())); Bitacora.trace("funciones=" + funciones.size()); for (FuncionBase f : funciones) { id = f.getIdFuncion(); esPublica = BitUtils.valueOf(f.getEsPublica()); esProgramatica = BitUtils.valueOf(f.getEsProgramatica()); esProtegida = BitUtils.valueOf(f.getEsProtegida()); esPersonalizable = BitUtils.valueOf(f.getEsPersonalizable()); esSegmentable = BitUtils.valueOf(f.getEsSegmentable()); esLectura = esFuncionLectura(f); esAutorizada = false; esLecturaAutorizada = esLectura && isUserInRoleSuperLector(); esAccesoPersonalizado = esPersonalizable; if (dynrbac) { rolesPorUsuario = usuario.getRolUsuarioByIdUsuarioCollection(); if (rolesPorUsuario != null && !rolesPorUsuario.isEmpty()) { for (RolUsuarioBase ru : rolesPorUsuario) { RolBase r = findRol(ru.getIdRol().getIdRol(), roles); funcionesPorRol = r == null ? null : r.getRolFuncionByIdRolCollection(); if (funcionesPorRol != null && !funcionesPorRol.isEmpty()) { autorizacion = getAutorizacionFuncion(id, esPersonalizable, esSegmentable, funcionesPorRol, conjuntos); switch (autorizacion) { case AUTORIZADA: esAutorizada = true; esAccesoPersonalizado = false; /* permite acceso a recursos de otros usuarios */ break; case ACCESO_PERSONALIZADO: esAutorizada = true; break; case NO_AUTORIZADA: default: break; } } } } } else if (roles != null && !roles.isEmpty()) { for (RolBase rol : roles) { funcionesPorRol = isUserInRole(rol.getCodigoRol()) ? rol.getRolFuncionByIdRolCollection() : null; if (funcionesPorRol != null && !funcionesPorRol.isEmpty()) { autorizacion = getAutorizacionFuncion(id, esPersonalizable, esSegmentable, funcionesPorRol, conjuntos); switch (autorizacion) { case AUTORIZADA: esAutorizada = true; esAccesoPersonalizado = false; /* permite acceso a recursos de otros usuarios */ break; case ACCESO_PERSONALIZADO: esAutorizada = true; break; case NO_AUTORIZADA: default: break; } } } } if (esPublica || esProgramatica || esLecturaAutorizada || (esAccesoPersonalizado && !esProtegida) || esAutorizada) { funcionAutorizada = new FuncionAutorizada(); funcionAutorizada.setFuncion(id); funcionAutorizada.setPublica(esPublica); funcionAutorizada.setProgramatica(esProgramatica); funcionAutorizada.setProtegida(esProtegida); funcionAutorizada.setPersonalizable(esPersonalizable); funcionAutorizada.setSegmentable(esSegmentable); funcionAutorizada.setLectura(esLectura); funcionAutorizada.setAutorizada(esAutorizada); funcionAutorizada.setLecturaAutorizada(esLecturaAutorizada); funcionAutorizada.setAccesoPersonalizado(esAccesoPersonalizado); funcionesAutorizadas.add(funcionAutorizada); } } } private boolean esFuncionLectura(FuncionBase f) { int i = f.getNumeroTipoFuncion().getNumeroTipoFuncion(); TipoFuncionEnumeration e = TipoFuncionEnumeration.valueOf(i); return TipoFuncionEnumeration.CONSULTA.equals(e) || TipoFuncionEnumeration.INFORME.equals(e) || TipoFuncionEnumeration.ARCHIVO.equals(e); } private AutorizacionFuncion getAutorizacionFuncion(Long id, boolean esPersonalizable, boolean esSegmentable, Collection<? extends RolFuncionBase> funcionesPorRol, Collection<? extends ConjuntoSegmentoBase> conjuntos) { Collection<? extends ElementoSegmentoBase> segmentos; for (RolFuncionBase rf : funcionesPorRol) { if (id.equals(rf.getIdFuncion().getIdFuncion())) { for (RolFuncionParBase rfp : rf.getRolFuncionParByIdRolFuncionCollection()) { addParametro(id, rfp.getIdFuncionParametro().getIdFuncionParametro()); } if (esSegmentable) { if (rf.getIdConjuntoSegmento() == null) { addSegmento(id, null); } else { ConjuntoSegmentoBase c = findConjunto(rf.getIdConjuntoSegmento().getIdConjuntoSegmento(), conjuntos); segmentos = c == null ? null : c.getElementoSegmentoByIdConjuntoSegmentoCollection(); if (segmentos != null && !segmentos.isEmpty()) { for (ElementoSegmentoBase es : segmentos) { addSegmento(id, es.getSegmentoEnteroGrande()); } } } } return esPersonalizable && BitUtils.valueOf(rf.getEsAccesoPersonalizado()) ? AutorizacionFuncion.ACCESO_PERSONALIZADO : AutorizacionFuncion.AUTORIZADA; } } return AutorizacionFuncion.NO_AUTORIZADA; } private void addParametro(Long idFuncion, Long idParametro) { ParametroAutorizado parametroAutorizado = new ParametroAutorizado(); parametroAutorizado.setFuncion(idFuncion); parametroAutorizado.setParametro(idParametro); if (parametrosAutorizados.contains(parametroAutorizado)) { } else { parametrosAutorizados.add(parametroAutorizado); } } private void addSegmento(Long idFuncion, Long idSegmento) { SegmentoAutorizado segmentoAutorizado = new SegmentoAutorizado(); segmentoAutorizado.setFuncion(idFuncion); segmentoAutorizado.setSegmento(idSegmento); if (segmentosAutorizados.contains(segmentoAutorizado)) { } else { segmentosAutorizados.add(segmentoAutorizado); } } private UsuarioBase findUsuario(String codigo) { // String query = "select a from Usuario as a " // + "left join fetch a.rolUsuarioByIdUsuarioCollection " // + "where a.codigoUsuario = '" + codigo + "'"; // /**/ // Bitacora.trace("findUsuario JPQL Query = " + query); // List<? extends UsuarioBase> list = EJBL.getUsuarioFacade().findByQuery(query, true); // UsuarioBase element = list == null || list.isEmpty() ? null : list.get(0); // return element; return EJBL.getUsuarioFacade().findByCodigo(codigo, true); } private List<? extends RolBase> findRoles() { // String query = "select a from Rol as a " // + "left join fetch a.rolFuncionByIdRolCollection as b " // + "left join fetch b.rolFuncionParByIdRolFuncionCollection " // + "order by a.idRol"; // /**/ // Bitacora.trace("findRoles JPQL Query = " + query); // List<? extends RolBase> list = EJBL.getRolFacade().findByQuery(query, true); // return list; return EJBL.getRolFacade().findAll(true); } private RolBase findRol(Long id, Collection<? extends RolBase> roles) { if (roles != null && !roles.isEmpty()) { for (RolBase element : roles) { if (id.equals(element.getIdRol())) { return element; } } } Bitacora.trace("*** rol " + id + " not found ***"); return null; } private List<? extends ConjuntoSegmentoBase> findConjuntos() { // String query = "select a from ConjuntoSegmento as a " // + "join fetch a.elementoSegmentoByIdConjuntoSegmentoCollection " // + "order by a.idConjuntoSegmento"; // /**/ // Bitacora.trace("findConjuntos JPQL Query = " + query); // List<? extends ConjuntoSegmentoBase> list = EJBL.getConjuntoSegmentoFacade().findByQuery(query, true); // return list; return EJBL.getConjuntoSegmentoFacade().findAll(true); } private ConjuntoSegmentoBase findConjunto(Long id, Collection<? extends ConjuntoSegmentoBase> conjuntos) { if (conjuntos != null && !conjuntos.isEmpty()) { for (ConjuntoSegmentoBase element : conjuntos) { if (id.equals(element.getIdConjuntoSegmento())) { return element; } } } Bitacora.trace("*** conjunto " + id + " not found ***"); return null; } private void track(boolean b) { Bitacora.trace("idUsuario=" + getIdUsuario()); Bitacora.trace("codigoUsuario=" + getCodigoUsuario()); Bitacora.trace("nombreUsuario=" + getNombreUsuario()); Bitacora.trace("SuperGestor=" + isUserInRoleSuperGestor()); Bitacora.trace("SuperLector=" + isUserInRoleSuperLector()); Bitacora.trace("Operador=" + isUserInRoleOperador()); Bitacora.trace("funcionesAutorizadas=" + funcionesAutorizadas.size()); Bitacora.trace("parametrosAutorizados=" + parametrosAutorizados.size()); Bitacora.trace("segmentosAutorizados=" + segmentosAutorizados.size()); Bitacora.trace("modificado=" + modificado); Bitacora.trace("fechaHoraModificacion=" + fechaHoraModificacion); Bitacora.trace("fechaHoraModificacion<fechaHoraInicioSesion=" + (fechaHoraModificacion < getSessionCreationTime())); if (b) { List<? extends RolBase> roles; roles = EJBL.getRolFacade().findAll(); if (roles != null && !roles.isEmpty()) { for (RolBase rol : roles) { Bitacora.trace(rol.getCodigoRol() + "," + isUserInRole(rol.getCodigoRol())); } } for (FuncionAutorizada f : funcionesAutorizadas) { Bitacora.trace(f.toString()); } for (ParametroAutorizado p : parametrosAutorizados) { Bitacora.trace(p.toString()); } for (SegmentoAutorizado s : segmentosAutorizados) { Bitacora.trace(s.toString()); } } } }