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

Desactivar firewall de seguridad en tus test en Symfony2

2 de febrero de 2015

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

#1

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

2 febrero 2015, 23:01
#2

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

3 febrero 2015, 12:15
#3

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

3 febrero 2015, 12:27
#4

Ahora sí funciona todo, muchísimas gracias Javier. Un saludo

@JuanluGarciaB

3 febrero 2015, 18:39