Files
tarisan_gitea/Fuentes/com/tarisan/servlets/Login.java
T
2025-06-09 13:37:06 +02:00

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