En este apartado se describirián cómo implementar los principales casos de uso que se pueden dar en la integración con SIU.
INDICE
1.- Login y permisos de un usuario sobre la aplicación
Este es un ejemplo de integración de un portal para empleados de la administración pública. En este portal el usuario se identifica por medio del Módulo de Firma Electrónico (MFE) y una vez identificado, SIU consulta los datos del empleado para saber a qué organismo u organismos pertenece. Cómo último paso, se menciona la a la "Plataforma de Acceso a Usuarios" (PAU) donde el portal consultará qué permisos tiene ese usuario en la aplicación cuando accede con un determinado organismo.
El flujo de una identificación en un portal para empleados sería el siguiente:
1.- El usuario se identifica mediante los diversos mecanismos que MFE le proporciona.
2.- Una vez identificado, el portal de la aplicación valida el token de identificación que MFE le devuelve y e invoca a siu para obtener los organismos asociados al usuario.
3.- El portal muestra los organismos al usuario y éste selecciona con cual desea acceder.
4.- El portal consulta en la aplicación PAU qué permisos tiene el empleado en ese organismo sobre la aplicación para saber qué funcionalidades puede mostrarles y cuales no.
En este ejemplo el portal está desarrollado con Java 1.7, Spring y Struts 2
PASO 1: El empleado se identifica mediante los métodos que proporciona MFE al portal:
El usuario selecciona la opción de Certificado electrónico (o cualquier otro).
PASO 2: Una vez identificado el usuario, el portal de la aplicación valida el token de identificación que MFE le devuelve (contra el mismo MFE) e invoca a siu para obtener los organismos asociados al usuario.
/**
* Método que valida al usuario, si éste pertenece a más de un organismo los muestra para que el usuario decida con cual entrar, si sólo pertenece
* a uno el método validará al usuario y podrá entrar directamente si sus datos son correctos.
*
* @return String
*/
public final String validateLogin() {
log.info("BEGIN validateLogin");
/**
* En principio signedData habra sido recuperado por la plataforma a través de inyección de dependencia. Si se recupera del request se deberá
* de extraer lo primero.
*
* signedData = (String) request.getParameter("signedData");
*/
clearErrorsAndMessages();
String ret = SUCCESS;
String identificationMethod = request.getParameter("identificationMethod");
try {
// Comprobamos los datos firmados en cliente
if (jwt != null && !"".equals(jwt)) {
request.getSession().setAttribute(SIGNEDDATA, jwt);// la 1ª vez que firma se mete en sesión
}
if (identificationMethod != null && !"".equals(identificationMethod)) {
request.getSession().setAttribute("identificationMethod", identificationMethod);
}
if (request.getSession().getAttribute(SIGNEDDATA) != null) {
jwt = (String) request.getSession().getAttribute(SIGNEDDATA);
// Validamos el jwt y si da error devolvemos el control al jsp
String idUser = validateJwt(idApplicationSIU, jwt);
if ("logout".equals(idUser)) {
return idUser;
}
if (getOrganismCode() != null && !getOrganismCode().equals("")) {
log.debug("Existe el código del organismo " + getOrganismCode());
} else {
log.info("Obtenemos la lista de organismos a los que pertenece el usuario");
Organism[] arrayOrganismos = getOrganisms(idUser);
if (arrayOrganismos.length > 1) {
UserInformation user = new UserInformation();
user.setMoreRoles(true);
request.getSession().setAttribute(SESSION_ATT_USER_LOGIN, user);
setArrayOrganism(arrayOrganismos);
if (getCertText() == null && request.getParameter("textcert") != null) {
setCertText(request.getParameter("textcert"));
}
if (getArrayOrganism() == null) {
log.error("No se han encontrado organismos para el usuario");
addActionError(getText("No se han encontrado organismos para este usuario"));
}
} else {
log.info("El usuario sólo tiene un organismo");
setOrganismCode(arrayOrganismos[0].getOrganismCode());
}
return ret;
}
} else {
log.info("No hay idUser");
return ret;
}
} catch (Exception e) {
log.error(e);
if (e.getCause() != null) {
addActionError(e.getCause().toString());
} else {
addActionError("Ha ocurrido un error inesperado");
log.debug(e.getMessage());
}
return ret;
}
log.info("END validateLogin");
return ret;
}
/**
* Método que devuelve los organismos a partir de un token
*
* @param token
* @return Organism[]
*/
private Organism[] getOrganisms(String nif) {
Organism[] listOrganism = null;
UserSearch userSearch = new UserSearch();
userSearch.setNif(nif);
ParamAdditionalDataOrganismListByUser paramAdditionalDataOrganismListByUser = new ParamAdditionalDataOrganismListByUser(userSearch);
paramAdditionalDataOrganismListByUser.setApplicationId(idApplicationSIU);
ResultAdditionalDataOrganismListByUser result = new ResultAdditionalDataOrganismListByUser();
try {
log.info("Inicio llamada a SIU : método additionalDataOrganismListByUser");
result = siuAgent.additionalDataOrganismListByUser(paramAdditionalDataOrganismListByUser);
log.info("Fin llamada a SIU : método additionalDataOrganismListByUser");
} catch (Throwable e) {
log.error("Throwable al recoger la lista de organismos del usuario, " + e.getMessage(), e);
addActionError(e.getMessage());
}
if (result.isErrors()) {
log.error(result.getErrorMsg());
addActionError(result.getErrorMsg());
listOrganism = new Organism[1];
} else {
log.debug("tamaño vector" + result.getOrganismByUser().length);
OrganismByUser[] organisms = result.getOrganismByUser();
if (organisms[0].getOrganisms().length != 0) {
listOrganism = fillUserOrganisms(organisms[0].getOrganisms());
setArrayOrganism(listOrganism);
}
}
log.info("END getOrganisms");
return listOrganism;
}
Configurar del cliente de SIU mediante Spring.
<!-- IMPLEMENTACIONES DE SERVICIOS -->
<bean id="siuAgent" class="es.aragon.siu.core.ws.client.SIUClient">
<property name="userServices" ref="siu_user" />
<property name="stampServices" ref="siu_stamp" />
<property name="roleServices" ref="siu_role" />
<property name="infoServices" ref="siu_info" />
<property name="organismServices" ref="siu_organism" />
<property name="logoServices" ref="siu_logo" />
<property name="buildingServices" ref="siu_Building" />
</bean>
<bean id="siu_user" class="es.aragon.siu.core.ws.IUserServices"
factory-bean="siu_user_client" factory-method="create"/>
<bean id="siu_user_client" class="org.apache.cxf.frontend.ClientProxyFactoryBean" depends-on="configurationXml">
<property name="serviceClass" value="es.aragon.siu.core.ws.IUserServices"/>
<property name="address" value="#{configurationXml.getProperty('ADMIN_W','WebServices','SIU-UserServices')}"/>
<property name="outInterceptors">
<ref bean="authorizeOutIterceptor" />
</property>
</bean>
<bean id="siu_stamp" class="es.aragon.siu.core.ws.IStampServices"
factory-bean="siu_stamp_client" factory-method="create"/>
<bean id="siu_stamp_client" class="org.apache.cxf.frontend.ClientProxyFactoryBean" depends-on="configurationXml">
<property name="serviceClass" value="es.aragon.siu.core.ws.IStampServices"/>
<property name="address" value="#{configurationXml.getProperty('ADMIN_W','WebServices','SIU-StampServicesWS')}"/>
<property name="outInterceptors">
<ref bean="authorizeOutIterceptor" />
</property>
</bean>
<bean id="siu_logo" class="es.aragon.siu.core.ws.ILogoServices"
factory-bean="siu_logo_client" factory-method="create"/>
<bean id="siu_logo_client" class="org.apache.cxf.frontend.ClientProxyFactoryBean" depends-on="configurationXml">
<property name="serviceClass" value="es.aragon.siu.core.ws.ILogoServices"/>
<property name="address" value="#{configurationXml.getProperty('ADMIN_W','WebServices','SIU-LogoServicesWS')}"/>
<property name="outInterceptors">
<ref bean="authorizeOutIterceptor" />
</property>
</bean>
<bean id="siu_role" class="es.aragon.siu.core.ws.IRoleServices"
factory-bean="siu_role_client" factory-method="create"/>
<bean id="siu_role_client" class="org.apache.cxf.frontend.ClientProxyFactoryBean" depends-on="configurationXml">
<property name="serviceClass" value="es.aragon.siu.core.ws.IRoleServices"/>
<property name="address" value="#{configurationXml.getProperty('ADMIN_W','WebServices','SIU-RoleServicesWS')}"/>
<property name="outInterceptors">
<ref bean="authorizeOutIterceptor" />
</property>
</bean>
<bean id="siu_info" class="es.aragon.siu.core.ws.IInfoServices"
factory-bean="siu_info_client" factory-method="create"/>
<bean id="siu_info_client" class="org.apache.cxf.frontend.ClientProxyFactoryBean" depends-on="configurationXml">
<property name="serviceClass" value="es.aragon.siu.core.ws.IInfoServices"/>
<property name="address" value="#{configurationXml.getProperty('ADMIN_W','WebServices','SIU-InfoServices')}"/>
<property name="outInterceptors">
<ref bean="authorizeOutIterceptor" />
</property>
</bean>
<bean id="siu_organism" class="es.aragon.siu.core.ws.IOrganismServices"
factory-bean="siu_organism_client" factory-method="create"/>
<bean id="siu_organism_client" class="org.apache.cxf.frontend.ClientProxyFactoryBean" depends-on="configurationXml">
<property name="serviceClass" value="es.aragon.siu.core.ws.IOrganismServices"/>
<property name="address" value="#{configurationXml.getProperty('ADMIN_W','WebServices','SIU-OrganismServicesWS')}"/>
<property name="outInterceptors">
<ref bean="authorizeOutIterceptor" />
</property>
</bean>
<bean id="siu_Building" class="es.aragon.siu.core.ws.IBuildingServices"
factory-bean="siu_building_client" factory-method="create"/>
<bean id="siu_building_client" class="org.apache.cxf.frontend.ClientProxyFactoryBean" depends-on="configurationXml">
<property name="serviceClass" value="es.aragon.siu.core.ws.IBuildingServices"/>
<property name="address" value="#{configurationXml.getProperty('ADMIN_W','WebServices','SIU-BuildingServicesWS')}"/>
<property name="outInterceptors">
<ref bean="authorizeOutIterceptor" />
</property>
</bean>
PASO 3.- El portal muestra los organismos al usuario y éste selecciona con cual desea acceder.
Una vez cargados los organismos del usuario, si tiene más de uno, muestra un combo para seleccionar el organismo con el que se quiere conectar a la aplicación.
Una vez seleccionado, pulsar Entrar.
PASO 4.- El portal consulta en la aplicación PAU qué permisos tiene el empleado sobre la aplicación cuando accede con este organismo para saber qué funcionalidades puede mostrarles y cuales no. Por ejemplo si es administrador, consultor, puede crear o editar...
/**
Llamada a PAU para los permisos
**/
ResultAuthorize resultAuthorize = null;
ParamAuthorize paramAuthorize = new ParamAuthorize(fiscalAnagram, organismCode, ApplicationActions.SIU);
try {
resultAuthorize = pauAgent.authorize(paramAuthorize);
//Resto de codigo ....