/** * @(#) Login.java */ package com.tarisan.servlets; import com.tarisan.control.*; import com.tarisan.data.*; import com.tarisan.excepcion.*; import com.tarisan.log.*; import com.tarisan.persistencia.PersistenciaParametros; import java.io.IOException; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.Calendar; import jakarta.servlet.*; import jakarta.servlet.http.*; /** * Login (validación y autenticación) del usuario en la aplicación Tarisan. * @author Dpto. Informática. * @version 1.0, 24/09/2003 */ public class Login extends HttpServlet implements Constantes { /** * Recepción del método POST requerida por un cliente.
* Comprueba el usuario/password del médico conectado respondiendo de la siguiente manera:
    *
  1. Si no existe el usuario redirige a la página de error con el mensaje de usuario no encontrado
  2. *
  3. Si existe el usuario:
  4. *
* @param request Objeto HttpServletRequest enviado por el cliente. * @param response Objeto HttpServletResponse que recibirá el cliente. */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { LogTarisan.logger.log(NivelLog.INFO, " Login.doPost().INI - Empezamos - java 8"); response.setHeader("Expires", "0"); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); HttpSession sesion = request.getSession(true); //Borrar los objetos de sesión del usuario conectado anteriormente sesion.removeAttribute("USUARIO"); sesion.removeAttribute("PERFIL"); sesion.removeAttribute("MEDICO"); String codigo = request.getParameter("USUARIO"); String clave = request.getParameter("CLAVE"); Usuario usuario = null; Object objetoSeleccionado = null; Object objetoSeleccionadoSimulado = null; String sMensaje = ""; int nCodigo = Integer.parseInt(codigo); try { /*int nCodigo = Integer.parseInt(codigo);*/ sesion.setAttribute("MEDICO", nCodigo); PersistenciaUsuario perUsu = new PersistenciaUsuario(); PersistenciaTaregmed perRegMed = new PersistenciaTaregmed(); Calendar calHoy = Calendar.getInstance(); try { if ((request.getParameter("SIMULADO")!=null)&&(Integer.parseInt(request.getParameter("SIMULADO"))==1)){ objetoSeleccionadoSimulado = perUsu.seleccionarSimulado(nCodigo); usuario = (Usuario)objetoSeleccionadoSimulado; sesion.setAttribute("USUARIO", null); sesion.setAttribute("USUARIO", usuario); String perfil = this.obtenerPerfilHashtable(usuario.getEspecialidad()); sesion.setAttribute("PERFIL", perfil); LogTarisan.logger.log(NivelLog.DEBUG, "Perfil: "+perfil); if (perfil.compareTo(PERFIL_ADMINISTRADOR) == 0) { response.sendRedirect("./GestorAdministracion?OPCION=" + OPC_ADM_USUARIO_LISTA); } else{ response.sendRedirect("../jsp/med/noticias.jsp?x=19&pagina=1"); } }else{ objetoSeleccionado = perUsu.seleccionar(nCodigo, clave); usuario = (Usuario)objetoSeleccionado; if(this.numeroIntentosExcedido(sesion)) { //Se ha sobrepasado el número máximo de intentos de conexión en la sesión de usuario LogTarisan.logger.log(NivelLog.DEBUG, "Login.java llega 81, vamos a bloquear el usuario\n\n\n"); perUsu.bloquearUsuario(nCodigo, calHoy); sMensaje = this.obtenerMensaje(USUARIO_INTENTOS); LogTarisan.logger.log(NivelLog.INFO, sMensaje); sesion.setAttribute("ERROR", sMensaje); response.sendRedirect("../jsp/error.jsp" ); } else { //Usuario correcto LogTarisan.logger.log(NivelLog.INFO, "Usuario " + usuario + " conectado correctamente: "+usuario.getEspecialidad()); LogTarisan.logger.log(NivelLog.DEBUG, "\n\nSession timeout: "+sesion.getMaxInactiveInterval()); //Creación de los objetos de sesión propios //IDENTIFICACION TIPO DE PERFIL sesion.setAttribute("USUARIO", null); sesion.setAttribute("USUARIO", usuario); //String perfil = this.obtenerPerfil(usuario.getEspecialidad()); String perfil = this.obtenerPerfilHashtable(usuario.getEspecialidad()); sesion.setAttribute("PERFIL", perfil); sesion.removeAttribute("INTENTOS"); LogTarisan.logger.log(NivelLog.DEBUG, "Perfil: "+perfil); //Registro del acceso exitoso del usuario a la aplicación perRegMed.insertar(nCodigo, calHoy, "S"); if (usuario.getFechaUltAcceso() == null) { usuario.setFechaUltAcceso(new Timestamp(calHoy.getTime().getTime())); //Introducción de la nueva clave de usuario por ser primer acceso en la aplicación LogTarisan.logger.log(NivelLog.INFO, "El Usuario " + usuario + " tiene que cambiar la clave"); response.sendRedirect("../jsp/cambio_clave.jsp" ); } else if (usuario.getFechaCaducidad() != null) { //Actualización de la fecha de último acceso perUsu.actualizarFechaAcceso(nCodigo, calHoy); usuario.setFechaUltAcceso(new Timestamp(calHoy.getTime().getTime())); //Muestra el mensaje de preaviso de caducidad de la clave SimpleDateFormat sdf = new SimpleDateFormat(PersistenciaParametros.formatoFechas); StringBuffer mensaje = new StringBuffer(); mensaje.append(this.obtenerMensaje(USUARIO_PREAVISO)); mensaje.append(" "); mensaje.append(sdf.format(usuario.getFechaCaducidad())); LogTarisan.logger.log(NivelLog.INFO, mensaje.toString()); sesion.setAttribute("ERROR", mensaje.toString()); response.sendRedirect("./GestorMedicos?OPCION=" + OPC_MED_PREAVISO); } else { //Actualización de la fecha de último acceso perUsu.actualizarFechaAcceso(nCodigo, calHoy); usuario.setFechaUltAcceso(new Timestamp(calHoy.getTime().getTime())); //Redirección a la página inicial de la aplicación según el perfil del usuario conectado if (perfil.compareTo(PERFIL_ADMINISTRADOR) == 0) { response.sendRedirect("./GestorAdministracion?OPCION=" + OPC_ADM_USUARIO_LISTA); } else { if(nCodigo==956){ sesion.setAttribute("U", null); sesion.setAttribute("U", nCodigo); response.sendRedirect("../jsp/adm/simulado.jsp" ); }else{ //response.sendRedirect("./GestorMedicos?OPCION=" + OPC_MED_LIQUIDACION); //sMensaje = "

CAMBIOS A PARTIR DEL 16/03/2015:

- SE ACTUALIZA EL CATÁLOGO DE DETERMINACIONES EN LAS PETICIONES DE ANALiTICAS
- SEGuN INDICACIONES DEL IGUALATORIO ALGUNAS DETERMINACIONES NECESItARaN JUSTIFICAción

CONSULTAR FUNCIONAMIENTO PINCHANDO AQUi

"; //PersistenciaTamensaje pertamensaje = new PersistenciaTamensaje(); //sMensaje = pertamensaje.obtenerMensaje(69).getMensaje(); //No quitar el html del campo de la bbdd si se quiere guardar el estilo (parpadeante de rojo a negro) //sesion.setAttribute("AVISO", sMensaje); //response.sendRedirect("../jsp/pac/gestor.jsp"); response.sendRedirect("../jsp/med/noticias.jsp?x=19&pagina=1"); } } } } } } catch(ClassCastException ex1) { //Obtención del mensaje de error correspondiente al intento de login en la aplicación Integer nMensaje = (Integer)objetoSeleccionado; if(((nMensaje == USUARIO_INEXISTENTE) || (nMensaje == USUARIO_ERROR_CLAVE)) && (this.numeroIntentosExcedido(sesion))) { sMensaje = this.obtenerMensaje(USUARIO_INTENTOS); try { perUsu.bloquearUsuario(nCodigo, calHoy); } catch (ExcepcionTarisan e) { LogTarisan.logger.log(NivelLog.ERROR, "Excepción en el login de usuario " + codigo + ": " + e); sesion.setAttribute("ERROR", ""); response.sendRedirect("../jsp/error.jsp" ); } } else { sMensaje = this.obtenerMensaje(nMensaje); try { if(nMensaje != USUARIO_INEXISTENTE) //Registro del acceso fallido del usuario a la aplicación perRegMed.insertar(nCodigo, calHoy, "N"); } catch(ExcepcionTarisan ex) { LogTarisan.logger.log(NivelLog.ERROR, "Excepción en el login de usuario " + codigo + ": " + ex); sesion.setAttribute("ERROR", ""); response.sendRedirect("../jsp/error.jsp" ); } } sesion.setAttribute("ERROR", sMensaje); LogTarisan.logger.log(NivelLog.INFO, sMensaje); response.sendRedirect("../jsp/error.jsp" ); } catch(ExcepcionTarisan ex) { LogTarisan.logger.log(NivelLog.ERROR, "Excepción en el login de usuario " + codigo + ": " + ex); sesion.setAttribute("ERROR", ""); response.sendRedirect("../jsp/error.jsp" ); } } catch(NumberFormatException ex) { LogTarisan.logger.log(NivelLog.ERROR, "Excepción en el login de usuario " + codigo + ": " + ex); if(this.numeroIntentosExcedido(sesion)) { sMensaje = this.obtenerMensaje(USUARIO_INTENTOS); try { PersistenciaUsuario perUsu = new PersistenciaUsuario(); Calendar calHoy = Calendar.getInstance(); perUsu.bloquearUsuario(Integer.parseInt(codigo), calHoy); } catch (ExcepcionTarisan e) { LogTarisan.logger.log(NivelLog.ERROR, "Excepción en el login de usuario " + codigo + ": " + e); sesion.setAttribute("ERROR", ""); response.sendRedirect("../jsp/error.jsp" ); } } else { sMensaje = this.obtenerMensaje(USUARIO_INEXISTENTE); } LogTarisan.logger.log(NivelLog.INFO, sMensaje); sesion.setAttribute("ERROR", sMensaje); response.sendRedirect("../jsp/error.jsp" ); } //} LogTarisan.logger.log(NivelLog.INFO, "Login.doPost().FIN - java 8"); } /** * Calcula el perfil asignado al médico conectado en función de su especialidad. * @param especialidad El valor de la especialidad del médico. * @return El código de perfil asignado a la especialidad. */ private String obtenerPerfil(int especialidad) { String perfil = ""; switch (especialidad) { case 0: { perfil = PERFIL_ADMINISTRADOR; break; } case 1: { perfil = PERFIL_CABECERA; break; } case 4: { perfil = PERFIL_ANALISTA; break; } case 17: { /*perfil = PERFIL_ANALISTA;*/ perfil = PERFIL_RADIOLOGO; break; } case 19: { perfil = PERFIL_DENTISTA; break; } case 37: { perfil = PERFIL_REHABPOD; break; } case 50: { perfil = PERFIL_ATS; } case 53: { perfil = PERFIL_REHABPOD; break; } case 70: { perfil = PERFIL_ODONTOLOGIA; break; } default: { perfil = PERFIL_ESPECIALISTA; break; } } LogTarisan.logger.log(NivelLog.DEBUG, "A la especialidad:"+especialidad+"le corresponde el perfil:"+perfil); return perfil; } /** * Calcula el perfil asignado al médico conectado en función de su especialidad * teniendo en cuenta el fichero de propiedades tarisan.properties * @param especialidad El valor de la especialidad del médico. * @return El código de perfil asignado a la especialidad. */ private String obtenerPerfilHashtable(int especialidad) { String perfil = ""; boolean existe = ParametrosConfiguracion.tablaPerfiles.containsKey(Integer.valueOf(especialidad)); if (existe) { perfil = ParametrosConfiguracion.tablaPerfiles.get(Integer.valueOf(especialidad)).toString(); } else { perfil = Constantes.PERFIL_ESPECIALISTA; } LogTarisan.logger.log(NivelLog.DEBUG, " - Existe hastable? - " + existe); return perfil; } /** * Obtiene el mensaje de error correspondiente al intento de conexión de usuario. * @param nMensaje Número del mensaje. * @return El mensaje correspondiente. */ private String obtenerMensaje(Integer nMensaje) { String mensaje = ""; if(nMensaje.equals(USUARIO_INEXISTENTE)) { mensaje = "Usuario y password inexistentes, vuelva a intentarlo por favor"; } else if(nMensaje.equals(USUARIO_ERROR_CLAVE)) { mensaje = "Usuario y password inexistentes, vuelva a intentarlo por favor"; } else if(nMensaje.equals(USUARIO_BLOQUEADO)) { mensaje = "Usuario bloqueado"; } else if(nMensaje.equals(USUARIO_CADUCADO)) { mensaje = "Usuario bloqueado, su clave ha caducado"; } else if(nMensaje.equals(USUARIO_PREAVISO)) { mensaje = "Por favor cambie su clave de acceso, caduca el día"; } else if(nMensaje.equals(USUARIO_INACTIVO)) { mensaje = "Usuario bloqueado por período de inactividad"; } else if(nMensaje.equals(USUARIO_INTENTOS)) { mensaje = "Ha sobrepasado el número máximo de intentos de conexión"; } else { mensaje = "Usuario correcto"; } return mensaje; } /** * Controla el número de intentos fallidos de conexión a la aplicación utilizando un objeto de sesión. * Si excede al valor del parámetro definido en el fichero de propiedades retornará true, en caso contrario false. * @param sesion La sesión del usuario conectado * @return El resultado de la comprobación del número de intentos habidos. */ private boolean numeroIntentosExcedido(HttpSession sesion) { String strIntentos = (String)sesion.getAttribute("INTENTOS"); int nIntentos = 0; if(strIntentos != null) { nIntentos = Integer.parseInt(strIntentos); } sesion.setAttribute("INTENTOS", String.valueOf(++nIntentos)); if (nIntentos > ParametrosConfiguracion.numeroIntentos) { return true; } else { return false; } } }