2011-12-10 7 views
10

Estoy desarrollando una parte de la creación de una aplicación web en Symfony 2. Al igual que en muchas aplicaciones, se requiere autorización de autenticación &. ¿Cómo puedo continuar desarrollando, teniendo en cuenta las ACL al pasar o fingir un inicio de sesión?Cómo desarrollar al iniciar sesión para probar las ACL en Symfony 2

En los documentos, login_check realiza la autenticación y sesiones de forma transparente. Creo que puede o bien tendrá que poner en práctica una versión de ese o de alguna manera llamar a una sesión como diferentes usuarios/papeles

Respuesta

29

No estoy completamente seguro de entender su pregunta, pero si son sólo preguntando cómo iniciar sesión programáticamente?

En mis pruebas Yo simplemente hago una llamada como:

$this->container->get('security.context')->setToken(
    new UsernamePasswordToken(
     'maintenance', null, 'main', array('ROLE_FIXTURE_LOADER') 
    ) 
); 

En este caso, 'mantenimiento' ni siquiera es una entidad real del usuario, es sólo un nombre de usuario que hice para mis accesorios para que puedan acceder a un servicio por tener ROLE_FIXTURE_LOADER y si lo desea iniciar sesión como una entidad completa del usuario (para que tengan el ID de ACL correcta) se puede obtener un objeto $user de la base de datos y llamar:

$this->container->get('security.context')->setToken(
    new UsernamePasswordToken(
     $user, null, 'main', $user->getRoles()) 
    ) 
); 

Esto no tiene' t hacer un inicio de sesión completo pero funciona con RBAC y d No veo por qué no funcionaría con ACL si pasa un objeto de usuario real.

En cuanto a las pruebas funcionales de mi interfaz si necesito iniciar sesión simplemente navego a la página de inicio de sesión y envío el formulario de acuerdo con los documentos de prueba. Para que cualquiera de los dos funcione, necesita acceder al contenedor, por lo que necesita ampliar WebTestCase o desplegar su propia capacidad para arrancar el kernel (consulte here).

Tengo la sensación de que he entendido mal la pregunta (es decir, necesitas hacer algo más complejo que solo colocar el token). Tal vez usted podría tratar de aclarar un poco más de lo que entendemos por

pasar o fingir un inicio de sesión

Un ejemplo concreto para plantar un token de seguridad en una prueba:

Primero hacer una clase base para que utilicen nuestras pruebas que contengan un método de inicio de sesión. Esto se puede hacer extendiendo WebTestCase y usando el método getContainer en un client O puede extraer WebTestCase para desplegar su propia clase base que simplemente inicia el kernel sin un cliente y devuelve el contenedor (vea mi link para obtener dos soluciones) .

namespace Acme\SomeBundle\Tests; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 

abstract class AcmeTestCase extends WebTestCase { 

    protected function loginAs($client, $username) { 
     $container = $client->getContainer(); 
     $doctrine = $container->get('doctrine'); 

     $user = $this->loadUser($doctrine, $username); 

     // First Parameter is the actual user object. 
     // Change 'main' to whatever your firewall is called in security.yml 
     $container->get('security.context')->setToken(
      new UsernamePasswordToken(
       $user, null, 'main', $user->getRoles() 
      ) 
     ); 
    } 

    private function loadUser($doctrine, $username) { 
     // Don't have to use doctrine if you don't want to, you could use 
     // a service to load your user since you have access to the 
     // container. 

     // Assumes User entity implements UserInterface 
     return $doctrine 
       ->getRepository('AcmeUserBundle:User') 
       ->findOneByUsername($username); 
    } 

} 

Luego solo necesita usar su clase base en la prueba que desee. De la misma manera:

namespace Acme\SomeBundle\Tests\Entity; 

use Acme\SomeBundle\Tests\AcmeTestCase; 

class SomeEntityTest extends AcmeTestCase { 

    public function somethingTest() { 
     $this->loginAs(static::createClient(), 'SomeUsernameInDB'); 

     // Do the rest of your test here. 
    } 

} 

Espero que esto ayude.

+0

Creo que lo entendiste bien, puedo intentarlo más tarde. Solo quiero falsificar un inicio de sesión para poder probar mi lógica de ACL. –

+0

Espero que te ayude :). Para probar ACL, use mi segundo fragmento. Simplemente obtenga su entidad '$ user' del' EntityManager' o 'Repository' primero y páselo al token como' $ user'. – Kasheen

+0

Ok, acabo de probar esto en realidad ... Estoy obteniendo 'No hay ningún proveedor de usuario para el usuario" Bottle \ Bundle \ NotesBundle \ Entity \ User "' ahora. De hecho, creé un 'FakeUserToken' personalizado, tal vez simplemente usé UsernamePasswordToken? Intentaba estar lo más cerca posible de la realidad en la que puedo obtener el usuario registrado. ¿Cómo puedo hacer eso con 'UsernamePasswordToken'? –

1

No estoy seguro de entender su pregunta muy bien, pero si lo que desea es ver la aplicación con diferente función de usuario puede utilizar el conmutador de papel Symfony documentado aquí: http://symfony.com/doc/current/book/security.html#impersonating-a-user

Así que sólo hay que poner un parámetro en su url para ver su aplicación como otro usuario conectado.

Espero que ayude!

+1

Creo que para esto necesito iniciar sesión como administrador primero –

Cuestiones relacionadas