Buenas,
Estoy empezando a testear mi aplicación Symfony, en la cuál tengo un firewall con el patrón ^/administration
. Al realizar cualquier test, la aplicación me hace una redirección a /login
.
¿Cómo podría deshabilitar la seguridad en el entorno de test? Un saludo y muchas gracias de antemano.
Juan Luis
Respuestas
Gracias a un truco bastante ingenioso, hacer lo que quieres es muy fácil. Todo está explicado en el artículo How to Simulate HTTP Authentication in a Functional Test de la documentación de Symfony.
Explicado de forma sencilla, la idea es que en el entorno de test, haces un pequeño cambio en el firewall mediante el archivo de configuración app/config/config_test.yml
. Así te olvidas del formulario de login y te pasas a la autenticación HTTP.
Gracias a este cambio, los tests se vuelven muy sencillos porque sólo tienes que indicar el usuario y contraseña con el que quieres loguearte en la aplicación y el test funcionará bien, sin redirigirte a la pantalla de login.
Otra forma más complicada de hacerlo sería navegar a la página de login, rellenar el formulario de login mediante el componente DomCrawler de Symfony y después seguir la redirección para ir a la página que querías probar.
@javiereguiluz
Gracias por tu respuesta Javier, he intentado la primera opción (HTTP) con las siguientes opciones pero me da un error que no sé resolver:
JLGB\CoreBundle\Tests\Controller\DefaultControllerTest::testDefault Symfony\Component\Config\Definition\Exception\InvalidConfigurationException: You are not allowed to define new elements for path "security.providers". Please define all elements for this path in one config file.
Mi config_test.yml
tiene:
security: encoders: Symfony\Component\Security\Core\User\User: plaintext providers: in_memory: memory: users: user: { password: user, roles: [ 'ROLE_EDITHOR' ] } admin: { password: admin, roles: [ 'ROLE_ADMIN' ] } firewalls: admin_area_secured_test: http_basic: ~
Mi test:
namespace JLGB\CoreBundle\Tests\Controller; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class DefaultControllerTest extends WebTestCase { public function testDefault() { $client = static::createClient(array(), array( 'PHP_AUTH_USER' => 'admin', 'PHP_AUTH_PW' => 'admin', )); $crawler = $client->request('GET', '/administration/blog/'); $this->assertEquals(200, $client->getResponse()->getStatusCode()); } }
¿Qué podría estar sucediendo?
Muchas gracias
@JuanluGarciaB
El error se produce porque en Symfony todos los proveedores de seguridad se deben configurar en el mismo archivo de configuración. Así que no puedes usar la opción providers
de security
en el archivo config_test.yml
.
La solución es muy sencilla, ya que solamente tienes que quitar las opciones encoders
y providers
del archivo config_test.yml
. La "gracia" del truco para testear la seguridad en Symfony es que no tienes que cambiar nada relacionado con la seguridad, salvo la forma específica en la que los usuarios se autentican.
En otras palabras, en el test estás usando el mismo firewall, los mismos usuarios, las mismas contraseñas, la misma forma de codificar contraseñas, etc. que en producción. Lo único que cambia, para hacer más fácil el test, es que no introduces el login/contraseña en un formulario sino en la caja que muestra el navegador.
@javiereguiluz
Ahora sí funciona todo, muchísimas gracias Javier. Un saludo
@JuanluGarciaB