/** * */ package net.conselldemallorca.helium.webapp.mvc.interceptor; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.conselldemallorca.helium.core.model.hibernate.Entorn; import net.conselldemallorca.helium.core.model.hibernate.ExpedientTipus; import net.conselldemallorca.helium.core.model.service.DissenyService; import net.conselldemallorca.helium.core.model.service.PermissionService; import net.conselldemallorca.helium.core.security.ExtendedPermission; import net.conselldemallorca.helium.webapp.v3.helper.SessionHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.acls.model.Permission; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; /** * Interceptor per a controlar si un usuari té permisos per * accedir al menu de disseny per als tipus d'expedient. * * @author Limit Tecnologies <limit@limit.es> */ public class PermisosDissenyInterceptor extends HandlerInterceptorAdapter { public static final String VARIABLE_SESSION_PERMISOS_DISSENY = "potDissenyarExpedientTipus"; public static final String VARIABLE_SESSION_PERMISOS_GESTIO = "potGestionarExpedientTipus"; public static final String VARIABLE_SESSION_PERMISOS_REASSIGNAR = "potReassignarExpedientTipus"; private DissenyService dissenyService; private PermissionService permissionService; public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request.getSession().getAttribute(VARIABLE_SESSION_PERMISOS_DISSENY) == null || request.getSession().getAttribute(VARIABLE_SESSION_PERMISOS_REASSIGNAR) == null) { Entorn entorn = getEntornActiu(request); boolean permisosDisseny = false; boolean permisosGestio = false; boolean permisosReassignar = false; if (entorn != null) { List<ExpedientTipus> llistat = dissenyService.findExpedientTipusAmbEntorn(entorn.getId()); for (ExpedientTipus expedientTipus: llistat) { if (potDissenyarExpedientTipus(entorn, expedientTipus)) { permisosDisseny = true; break; } if (potGestionarExpedientTipus(entorn, expedientTipus)) { permisosGestio = true; break; } } permissionService.filterAllowed( llistat, ExpedientTipus.class, new Permission[] { ExtendedPermission.ADMINISTRATION, ExtendedPermission.REASSIGNMENT}); permisosReassignar = llistat.size() > 0; } request.getSession().setAttribute(VARIABLE_SESSION_PERMISOS_DISSENY, new Boolean(permisosDisseny)); request.getSession().setAttribute(VARIABLE_SESSION_PERMISOS_GESTIO, new Boolean(permisosGestio)); request.getSession().setAttribute(VARIABLE_SESSION_PERMISOS_REASSIGNAR, new Boolean(permisosReassignar)); } return true; } @Autowired public void setDissenyService(DissenyService dissenyService) { this.dissenyService = dissenyService; } @Autowired public void setPermissionService(PermissionService permissionService) { this.permissionService = permissionService; } private Entorn getEntornActiu(HttpServletRequest request) { return (Entorn)request.getSession().getAttribute( SessionHelper.VARIABLE_ENTORN_ACTUAL); } private boolean potDissenyarExpedientTipus(Entorn entorn, ExpedientTipus expedientTipus) { return permissionService.filterAllowed( expedientTipus, ExpedientTipus.class, new Permission[] { ExtendedPermission.ADMINISTRATION, ExtendedPermission.DESIGN}) != null; } private boolean potGestionarExpedientTipus(Entorn entorn, ExpedientTipus expedientTipus) { return permissionService.filterAllowed( expedientTipus, ExpedientTipus.class, new Permission[] { ExtendedPermission.ADMINISTRATION, ExtendedPermission.MANAGE}) != null; } }