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
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
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
Modificando el app/autoload.php, de las otras 2 maneras que me has comentado, me sigue dando el mismo error.
@FrankXhea
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
Genial !!!, ya me va, muchismas gracias Javier.
Un saludo.
@FrankXhea
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