miércoles, 27 de enero de 2010

PHP y CAS

El sistema de web SSO CAS es uno de los más extendidos entre la comunidad Open Source. Originalmete creado por la Universidad de Yale sirve para proporcionar a las aplicaciones un modo fiable de autenticar usuarios.

Existen muchos clientes de CAS para integrarse con aplicaciones de diferentes tecnologías como Java, .Net, Perl, Apache y PHP. Para este último caso, el cliente se llama phpCAS. Este cliente ofrece un forma fácil de proteger cualquier aplicación escrita en PHP.

Los requisitos para instalar phpCAS son:
  • CURL 7.5+
  • PHP 4.3.1+, PEAR DB
  • Apache 2.0.44+
Con las últimas versiones de Apache 2.2.x y PHP 5.x el cliente es muy fácil de usar porque tdos estos componentes ya están incluídos.

Un ejemplo de la forma más básica de usar del cliente phpCAS para proteger una aplicación es la siguiente:

<?php
include_once('CAS.php');

phpCAS::setDebug();

phpCAS::client(CAS_VERSION_2_0,'my_cs_server',443,'/cas');

// no SSL validation for the CAS server

phpCAS::setNoCasServerValidation();


// force CAS authentication

phpCAS::forceAuthentication();


// at this step, the user has been authenticated by the CAS server

// and the user's login name can be read with phpCAS::getUser().


// logout if desired

if (isset($_REQUEST['logout'])) {

phpCAS::logout();
}

echo phpCAS::getUser();

?>


En este ejemplo es importante destacar la forma de crear el cliente, donde se usa el nombre del servidor de CAS, el puerto del servicio CAS y la URI de CAS ('/cas'). En este último caso la URI ha de corresponder a la aplicación y nunca a la página de login ('/cas/login').

Ahora bien, este ejemplo puede no funcionar porque hay un problema a la hora de crear la sesión de la aplicación. Si se usa este ejemplo, la creación de la sesión de usuario está implícita en la creación del cliente. En muchos casos este comportamiento puede no ser el deseado ya que se pierde el control sobre la sesión o no se crea bien. Para solucionarlo hay que modificar el ejemplo de la siguiente forma:

<?php
include_once('CAS.php');

session_start();
phpCAS::setDebug();

phpCAS::client(CAS_VERSION_2_0,'my_cs_server',443,'/cas',false);

// no SSL validation for the CAS server

phpCAS::setNoCasServerValidation();


// force CAS authentication

phpCAS::forceAuthentication();


// at this step, the user has been authenticated by the CAS server

// and the user's login name can be read with phpCAS::getUser().


// logout if desired

if (isset($_REQUEST['logout'])) {

phpCAS::logout();
}

echo phpCAS::getUser();

?>


Con estos dos cambios, la sesión se crea de forma explícita y se le informa al cliente de CAS de que no ha de crear una nueva.

7 comentarios:

Bernoo dijo...

Si pudieras documentar mas sobre el cliente, una vez logeado, como continuar logeado en paginas posteriores??

Jorge Ramiro dijo...

Como comencé a programar paginas en php me interesa poder saber mucho sobre esto, y por eso trato de saber y para eso en internet hay muy buena fuente de estas cosas. Como hace poco se rompió el monitor de mi computadora, aprovecho para usar el led 42 como tal

Beatriz Bastardo Medina dijo...

Hola, soy nueva en SSO, monte en tomcat7 cas3.5.2 y quiero proteger una app en php y validar contra un servidor OpenLDAP. Ya cree el directorio en apache2 con phpLDAPadmin, mi pregunta es la siguiente: ¿para proteger la app debo incluir en esta los archivos de phpCAS para hacer la conexion con cas3.5.2? estoy tratando de entender como hacerlo, necesito ayuda por favor!

Beatriz Bastardo Medina dijo...
Este comentario ha sido eliminado por el autor.
Alejandro Ugartondo dijo...

Hola Beatriz.
Efectivamente para proteger una aplicación con CAS debes incluir los archivos de phpCAS en ella.
Saludos

Beatriz Bastardo Medina dijo...

gracias por responder! instale por consola php-cas y la versión que esta en los repositorios es la 1.3.2 (bajo linux mint) ¿sabras si los archivos a incluir en la app son todos los que trajo la instalación mencionada anteriormente? xq también habia descargado php-cas1.3.4.tgz de https://developer.jasig.org/cas-clients/php/current/ y ahora me confundí, o sea no se exactamente cuales son los archivos que deben incluirse en la app y también tengo la duda de exactamente en cual directorio se almacenan estos archivos.

Beatriz Bastardo Medina dijo...

Hola alejandro, tengo el siguiente un problema con ésta integración de phpcas y cas. Trabaje con el ejemplo simple que trae la librería y los archivos que lo complementan que son config.php y scritp.php y me redirige a la página de login de cas y aparentemente hace la validación y emite el ticket, pero no me regresa a la aplicación por la cual ingrese, asumo que debo hacer una modificación en el código de cas ya sea en el deployerConfigContext.xml o en el web.xml por lo que he visto me parece que es el éste último pero no se exactamente que etiquetas debo agregar y si debo también incluir alguna clase necesaria para que funcione bien. Agradezco de antemano cualquier ayuda que pueda recibir de tu parte. Saludos!