Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Integrar SimpleSAML con Symfony2

26 de mayo de 2014

Saludos a la comunidad, estoy desarrollando mi primera aplicación en symfony2. La aplicación que estoy creando debe autenticarse con SimpleSAML, y no se como hacerlo.

He visto que hay algún bundle para hacerlo, pero el problema es que el directorio simplesamlphp está en una carpeta en el mismo servidor, fuera de la aplicación Symfony2, y no puedo moverlo, ni modificar nada del código dentro del directorio simplesamlphp/, porque no solo lo usará mi aplicación, sino que lo usan ya varias aplicaciones de otros desarrolladores.

En una aplicación php normal, bastaría con incluir el archivo _autoload.php, que está en /simplesamlphp/lib/ , y ya podría realizar la autenticación, pero en Symfony2 me encuentro con dos problemas que no sé solucionar:

1º ¿Cómo cargar clases, y sobretodo, como usarlas en el controlador, sin usar los namespaces?, ya que simpleSAML no los usa.

2º Como lo hago para ejecutar el contenido de _autoload.php de simpleSAML, o cómo integrarlo de alguna manera con la autocarga de clases de Symfony2.

Gracias por vuestra ayuda.


Respuestas

#1

Lo ideal sería que pudieras incluir ese proyecto SimpleSAML como dependencia de tu aplicación. No obstante, Symfony2 también está preparado para utilizar proyectos externos y que incluso no siguen las buenas prácticas modernas de usar namespaces.

La clave está en configurar bien el archivo app/autoload.php cuyo contenido será algo similar a lo siguiente:

// app/autoload.php
use Doctrine\Common\Annotations\AnnotationRegistry;
 
$loader = include __DIR__.'/../vendor/autoload.php';
 
AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
 
return $loader;

En este archivo puedes configurar la carga de clases de tu proyecto de varias formas. Si la librería sigue el estándar PEAR tradicional, lo más fácil sería añadir algo como esto:

$loader->add('Simple_SAML_', __DIR__.'/../../../../ ... /lib');

Si lo anterior no es posible, utiliza directamente la función set_include_path():

set_include_path(__DIR__.'/../../../../ ... /lib'.PATH_SEPARATOR.get_include_path());

Por último, si nada de esto te funciona, puedes optar por hacer un require_once() directamente en el archivo app/autoload.php.

@javiereguiluz

26 mayo 2014, 15:01
#2

Muchas gracias Javier, ahora mismo voy a probarlo, pero me asalta una duda: ¿Cómo llamo a las clases de simpleSAML desde el controlador?, porque la tercera opción, la de poner directamente el require_once en el app/autoload.php, la probé y al poner en el controlador la siguiente sentencia:

$as = new SimpleSAML_Auth_Simple("default-sp");

me da un error tal que este:

ClassNotFoundException: Attempted to load class "SimpleSAML_Auth_Simple"
from namespace "Pincap\BackendBundle\Controller" in
Z:\xampp\htdocs\PincaP\src\Pincap\BackendBundle\Controller\DefaultController.php 
line 41. Do you need to "use" it from another namespace?

Muchas gracias de nuevo por tu ayuda.

PD: Por cierto, mi primera aplicación, me está resultando mas complicada que la del cupón, ;-). Pero claro, la del cupón era "programación guíada", jejejeje.

@FrankXhea

26 mayo 2014, 15:42
#3

Modificando el app/autoload.php, de las otras 2 maneras que me has comentado, me sigue dando el mismo error.

@FrankXhea

26 mayo 2014, 16:03
#4

Después de configurar la carga automática de clases, en tu código deberías añadir el \ por delante de las clases o importarlas con use:

// esto no te va a funcionar
$as = new SimpleSAML_Auth_Simple("default-sp");
 
// esto debería funcionarte
$as = new \SimpleSAML_Auth_Simple("default-sp");

@javiereguiluz

26 mayo 2014, 16:09
#5

Genial !!!, ya me va, muchismas gracias Javier.

Un saludo.

@FrankXhea

26 mayo 2014, 16:44
#6

Por si a alguien le sirve de ayuda, la forma correcta de hacerlo es:

$simpleSamlPhpDir = ' .. ruta al directorio simplesamlphp ..';
$loader->add('sspmod_saml_', $simpleSamlPhpDir.'/simplesamlphp/lib/modules/saml/lib');
$loader->add('SimpleSAML_',  $simpleSamlPhpDir.'/simplesamlphp/lib/');
$loader->add('Auth_',        $simpleSamlPhpDir.'/simplesamlphp/lib/');
$loader->add('SAML2_',       $simpleSamlPhpDir.'/simplesamlphp/lib/');

Gracias.

@FrankXhea

28 mayo 2014, 11:29