Single Sign On de O3 con aplicaciones existentes
NOTA
La funcionalidad descrita en este documento está disponible a partir de la versión 7.1.4
Introducción
Si bien una forma de integrarse con el Single Sign On de O3 es la adaptación de la aplicación existente para que utilice el CAS de O3, en muchas oportunidades esto es demasiado complejo y se requiere una alternativa más simple.
Este documento presenta una forma de integración con aplicaciones existentes (que realizan una validación previa del usuario) para que éstas redirijan a O3 incluyendo información de autenticación, que permita que el usuario no deba ingresar nuevamente las credenciales al acceder a los diferentes módulos web de O3.Single Sign On de aplicaciones externas con los módulos web de O3
Este mecanismo permite evitar la autenticación en los módulos web de O3, considerando que el usuario ya se encuentra autenticado en otra aplicación (aplicación X, de ahora en más).
Características de la implementación
- Se utiliza un mecanismo de SSO basado en tickets.
- El ticket debe ser generado por la aplicación en la que se autentica el usuario 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 deben estar definidos en los dos sistemas (en la aplicación X y en O3). Dependiendo del repositorio de usuarios que la aplicación X utilice, se podrá integrar a O3 (por ejemplo LDAP), evitando tener que mantener la doble definición de usuarios.
Funcionamiento del mecanismo de SSO
- El usuario ingresa a la aplicación X, y en el momento que desea acceder al O3Portal se genera el ticket y se almacena en la base de datos (más adelante se propone el esquema de la tabla a utilizar).
- Cuando la aplicación genera un link al O3Portal, éste lleva 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
- O3 es quien elimina de la base de datos el ticket inmediatamente después de ser validado el usuario.
Base de datos
Debe existir 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 |
para MSsql server el tipo debe ser datetime
Expiración
Se utiliza 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 asegura de que el tiempo de vida no sea mayor a un valor predeterminado, por defecto de un día.
Esto se realiza para evitar que si no se eliminó correctamente un ticket no se permita el ingreso por tiempo indeterminado. El valor del tiempo de expiración se puede modificar a través de un parámetro.
URL generada desde la aplicación externa
La URL generada por la aplicación para redirigir a O3 debe llevar el parámetro "_externalTicket" con el valor del ticket generado por la aplicación y almacenado en la base de datos.
Por ejemplo:
http://localhost:8080/o3web?_externalTicket=12345678 |
http://localhost:8380/eportal/group/default?_externalTicket=12345678 |
Características que debería cumplir el ticket generado por la aplicación
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
Configuración del acceso a base de datos en O3
Debe configurarse la base de datos que se utilizará para realizar la validación de los tickets.
- Ejemplo de DataSource para una base MySql (<o3bi>/jboss/standalone/deployments/Ticket-ds.xml).
<?xml version="1.0" encoding="UTF-8"?> <datasources> <datasource jndi-name="java:jboss/datasources/TicketDS" pool-name="TicketDS" enabled="true" jta="true" use-java-context="true" use-ccm="true"> <connection-url> jdbc:mysql://localhost:5858/sso_tickets </connection-url> <driver> mysql </driver> <security> <user-name>root</user-name> <password>root</password> </security> </datasource> </datasources>
Ejemplo de DataSource para una base Postgres (<o3bi>/jboss/standalone/deployments/Ticket-ds.xml).
<?xml version="1.0" encoding="UTF-8"?> <datasources> <datasource jndi-name="java:jboss/datasources/TicketDS" pool-name="TicketDS" enabled="true" jta="true" use-java-context="true" use-ccm="true"> <connection-url> jdbc:postgresql://localhost:5432/sso_tickets </connection-url> <driver> postgres </driver> <security> <user-name>postgres</user-name> <password>postgres</password> </security> </datasource> </datasources>
Poner el driver en jboss. Para esto leer el wiki: Cómo configurar RBAC de O3BI con Diferentes Bases de Datos que explica como poner un driver en jboss7
- Script de creación de la tabla para MySQL
CREATE TABLE SSO_TICKETS ( Ticket character varying(100) NOT NULL, Ticket_TS timestamp NOT NULL, UserName character varying(50) NOT NULL, CONSTRAINT pk_sso_tickets PRIMARY KEY (Ticket) )
Ejemplo de insert para el usuario "admin"
INSERT INTO `SSO_TICKETS` (`Ticket`, `Ticket_TS`, `UserName`) VALUES ('12345678', '2016-08-01 03:00:00', 'admin');
Nota: acualizar la fecha para hacer el insert
Configuración de SSO en O3Web
Se debe de configurar el filtro de CAS para habilitar la recepción y validación de tickets desde aplicaciones externas.
Para esto hay que agregar los siguientes init-param en 2 filtros ("CASAuthenticationFilter" y "CAS Validation Filter") de CAS y en un Servlet que se llama "o3WebLogoutServlet" del archivo <o3bi>/jboss/standalone/deployments/o3-server.ear/o3web.war/o3web.war/WEB-INF/web.xml
<init-param> <param-name>ticket.validator</param-name> <param-value>com.ideasoft.cs.ejb.ticket.DbTicketValidator</param-value> </init-param> <init-param> <param-name>dbticket.datasource</param-name> <param-value>java:jboss/datasources/TicketDS</param-value> </init-param>
Nombre de atributo | Descripción | Valor por Defecto |
---|---|---|
ticket.validator | El nombre de la clase Java utilizada para validar el ticket, para la validación contra base de datos presentada aquí debe utilizarse el valor presentado en el ejemplo |
|
dbticket.datasource | Nombre JNDI del DataSource donde se declara el acceso a la base de datos que tiene la tabla con los tickets |
|
dbticket.expiration | Tiempo para la expiración de los tickets expresada en segundos | 86400 (un día) |
Configuración de SSO para EPortal
- Descomentar las siguientes propiedades del archivo <o3bi>/liferay/portal-ext.properties:
o3.autologin.validator=com.ideasoft.cs.ejb.ticket.DbTicketValidator dbticket.datasource=java:/comp/env/jdbc/TicketDB
Se puede especificar también la propiedad dbticket.expiration de la misma manera que para la configuración de O3Web.
- Agregar el "O3AutoLogin" en la property "auto.login.hooks".
Debe queda así: auto.login.hooks=com.liferay.portal.security.auth.CASAutoLogin,com.liferay.portal.security.auth.FacebookAutoLogin,com.liferay.portal.security.auth.NtlmAutoLogin,com.liferay.portal.security.auth.OpenIdAutoLogin,com.liferay.portal.security.auth.OpenSSOAutoLogin,com.liferay.portal.security.auth.RememberMeAutoLogin,com.liferay.portal.security.auth.SiteMinderAutoLogin,biz.ideasoft.liferay.portal.login.O3AutoLogin - Agregar la configuración de la Base de datos en liferay:
Agregar el "Resource" en el archivo <o3bi>liferay/tomcat/conf/context.xml
Ejemplo Mysql:<Resource name="jdbc/TicketDB" auth="Container" type="javax.sql.DataSource" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:5858/sso_tickets" maxActive="8" maxIdle="4"/>
<Resource name="jdbc/TicketDB" auth="Container" type="javax.sql.DataSource" username="postgres" password="postgres" driverClassName="org.postgresql.Driver" url="jdbc:postgresql://localhost:5432/sso_tickets" maxActive="8" maxIdle="4"/>