...
Code Block |
---|
<!-- CAS SSO --> <Valve className="com.ideasoft.sso.cas.tomcat.CASSingleSignOnValve" debug="0" filteredApps="/o3process,/o3portal,/o3planner,/liferay"/> |
Propuesta para Single Sign On enter una aplcación web existente y O3 utilizando mecanismo de tickets
En una conferencia telefónica se realizaron las siguientes definiciones:
- Se decidió utilizar un mecanismo de SSO basado en tickets.
- El ticket sería generado por la aplicación de Zonamerica y almacenado en una base de datos, el único requerimiento de dicha base de datos es que sea accesible por el servidor O3 a través de un driver JDBC.
- Los usuarios se mantendrían en los dos sistemas, sincronizados manualmente, queda para una segunda etapa la evaluación de una posible integración del repositorio de usuarios (a través de LDAP o algún otro mecanismo)
El funcionamiento sería el siguiente:
- El usuario ingresa a la aplicación de Zonamerica, en ese momento se genera el ticket y se almacena en la base de datos (más adelante se propone el esquema de la tabla a utilizar). Propuesta modificada: el ticket se genera recién al momento que el usuario ingresa al o3portal.
- Cuando la aplicación genera un link al O3Portal, éste llevaría el ticket como argumento de la URL
- O3 recibe el ticket y consulta la base de datos, para validar el ticket y obtener el nombre del usuario conectado
- El sistema de Zonamerica es responsable de eliminar de la base de datos el ticket asociado a una sesión cuando ésta es cerrada (ya sea explícitamente por el usuario o por una expiración) Propuesta modificada: O3 será quien elimine de la bse de datos el ticket inmediatamente después de ser validado el usuario
Base de datos
Se propone la existencia de una tabla llamada SSO_TICKETS con los siguientes campos:
Campo | Tipo | Descripción |
---|---|---|
Ticket | Varchar(100) | |
Ticket_TS | Timestamp | Fecha y hora de creación del ticket |
UserName | Varchar(50) | Login del usuario conectado |
Expiración
Se propone utilizar el campo Ticket_TS para la validación del Ticket, es decir cuando O3 valida el Ticket además de verificar que existe un registro en la tabla, se aseguraría de que el tiempo de vida no sea mayor a un parámetro que se defina (por ejemplo un día). Esto sería para evitar que si no se eliminó correctamente un ticket no permita el ingreso por tiempo indeterminado.
Características que debería cumplir el ticket
El ticket puede ser cualquier texto pero es recomendable:
- que sea único, en general se utiliza la hora de la máquina como uno de sus componentes para garantizar esa unicidad
- que no sea fácil de generar, por ejemplo que no sea un número secuencial, que permitiría "adivinar" un valor válido
Un ejemplo de una clase Java que puede ayudar a esta implementación es java.rmi.server.UID
Configuración de SSO según la propuesta planteada.
Se debe de configurar una válvula que es la encargada de correr la lógica de verificación del ticket.
Para esto se debe de tener en cuenta los siguientes puntos:
- El siguiente código se agrega en el archivo jboss\server\default\deploy\jbossweb-tomcat55.sar\server.xml (ponerlo bajo el ejemplo de CAS SSO).
Code Block | ||||
---|---|---|---|---|
| ||||
<Valve className="com.ideasoft.sso.cas.tomcat.DBSingleSignOnValve" debug="0" filteredApps="/o3portal" httpRedirect="http://www.ideasoft.biz" httpRedirectError="http://www.ideasoft.biz" dsName="java:/SSODS" expirationSeconds="86400" tableName="SSO_TICKETS">
</Valve>
|
Nombre de atributo | Descripción |
---|---|
dsName | es el jndi-name definido en el archivo de configuración del data source (java:/"jndi-name definido en el datasource"). |
expirationSeconds | son los segundos en que va a tener validez un ticket que se encuentre en la base (por defecto toma 24 horas). |
httpRedirect | es usado para redirecionar en caso de que no se encuentre el ticket. |
httpRedirectError | es usado para redirecionar en caso de que el ticket no valide en la DB ya sea por expiración del ticket o porque este no exista. |
tableName | es el nombre de la tabla donde se guarda el ticket. Por defecto toma "SSO_TICKETS" |
- Se debe de sustituir el jar jboss\server\default\deploy\jbossweb-tomcat55.sar\is_sso_tomcat.jar por el adjunto.
- Ejemplo dataSource para una base Hypersonic (jboss\server\default\deploy\gserver\zonaamerica-hsql-ds.xml).
Code Block | ||||
---|---|---|---|---|
| ||||
<?xml version="1.0" encoding="UTF-8"?>
<!-- ==================================================================== -->
<!-- Datasource config for Hypersonic SQL -->
<!-- ==================================================================== -->
<datasources>
<local-tx-datasource>
<jndi-name>SSODS</jndi-name>
<connection-url>jdbc:hsqldb:hsql://localhost:1701</connection-url>
<driver-class>org.hsqldb.jdbcDriver</driver-class>
<user-name>sa</user-name>
<password/>
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>Hypersonic SQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
|
En caso de que se trate de otra Base de Datos se debe de copiar el jar del driver en O3/jboss/server/default/lib y configurar el datasource con la url, driverClass, usuario y password adecuados.
- Script de creación de la tabla para Hypersonic.
No Format |
---|
create table SSO_TICKETS(Ticket Varchar(100) NOT NULL, Ticket_TS TIMESTAMP NOT NULL, UserName Varchar(50) NOT NULL, CONSTRAINT PK_SSO_TICKETS PRIMARY KEY(Ticket))
|
Problemas con CAS ejecutando detrás de un firewall
...