436 lines
14 KiB
Java
436 lines
14 KiB
Java
/**
|
|
* @(#) 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 <a href="mailto:sistemas@imqnavarra.com">Dpto. Informática</a>.
|
|
* @version 1.0, 24/09/2003
|
|
*/
|
|
public class Login extends HttpServlet implements Constantes
|
|
{
|
|
|
|
/**
|
|
* Recepción del método POST requerida por un cliente.<br>
|
|
* Comprueba el usuario/password del médico conectado respondiendo de la siguiente manera:<ol>
|
|
* <li>Si no existe el usuario redirige a la página de error con el mensaje de usuario no encontrado</li>
|
|
* <li>Si existe el usuario:<ul>
|
|
* <li>carga el objeto de sesión USUARIO con los datos del médico conectado</li>
|
|
* <li>carga el objeto de sesión PERFIL con el correspondiente al médico conectado</li>
|
|
* <li>para el perfil de administrador redirige a la página del listado de usuarios del módulo de administración</li>
|
|
* <li>para el resto de perfiles redirige a la página de liquidaciones del módulo de gestión de médicos</li>
|
|
* </ul></li>
|
|
* </ol>
|
|
* @param request Objeto <code>HttpServletRequest</code> enviado por el cliente.
|
|
* @param response Objeto <code>HttpServletResponse</code> 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 = "<h3 id='idAviso' style='text-align:left'>CAMBIOS A PARTIR DEL 16/03/2015:<br/><br/> - SE ACTUALIZA EL CATÁLOGO DE DETERMINACIONES EN LAS PETICIONES DE ANALiTICAS<br/> - SEGuN INDICACIONES DEL IGUALATORIO ALGUNAS DETERMINACIONES NECESItARaN JUSTIFICAción<br/><br/>CONSULTAR FUNCIONAMIENTO PINCHANDO <a href='/tarisan/Manual_Niveles_Analiticas.pdf' target='blank'>AQUi</a></h3>";
|
|
//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;
|
|
}
|
|
}
|
|
|
|
|
|
}
|