Single Sign On de O3 con aplicaciones existentes

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

  1. 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).
  2. Cuando la aplicación genera un link al O3Portal, éste lleva el ticket como argumento de la URL
  3. O3 recibe el ticket y consulta la base de datos, para validar el ticket y obtener el nombre del usuario conectado
  4. 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

(warning) 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 en el archivo "<o3bi>/jboss/standalone/deployments/o3-server.ear/o3web.war/o3web.war/WEB-INF/web.xml" los siguientes init-param en:

  • 2 filtros ("CASAuthenticationFilter" y "CAS Validation Filter")
  • un Servlet que se llama "o3WebLogoutServlet"

<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

  1. 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.
     

  2. 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


  3. 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"
    			validationQuery="select 1"
                maxActive="50"
                maxIdle="10"/>

    Ejemplo PostgreSQL:

     

    <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"
    			validationQuery="select 1"
                maxActive="50"
                maxIdle="10"/>