2011-12-10 12 views
10

Sto sviluppando una parte di un'app web build su Symfony 2. Come in molte app, è richiesta l'autenticazione &. Come posso continuare a sviluppare, prendendo delle considerazioni ACL passando o facendo un login?Come sviluppare tramite login falso per testare ACL in Symfony 2

Nei documenti, login_check l'autenticazione e le sessioni sono trasparenti. Credo di poter sia bisogno di implementare una versione di tale o in qualche modo chiamare il login come diversi utenti/ruoli

risposta

29

non sono del tutto sicuro di aver capito la tua domanda, ma sei solo chiedendo come si accede in modo programmatico?

Nei miei test ho semplicemente fare una chiamata del tipo:

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

In questo caso 'manutenzione' non è nemmeno una vera e propria entità User, è solo un nome utente che ho fatto per i miei dispositivi in ​​modo che possano accedere a un servizio avendo ROLE_FIXTURE_LOADER, ma se avete voglia di effettuare il login come entità utente completo (in modo che abbiano l'ID ACL corretto) è possibile ottenere un oggetto $user dal database e chiamare:

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

Questo doesn' t fare un login completo ma funziona con RBAC an d Non vedo perché non funzionerebbe con ACL se si passa un oggetto utente reale.

Per quanto riguarda il test funzionale del front end, se devo effettuare il login, accedo semplicemente alla pagina di accesso e invio il modulo come da documentazione di test. Affinché uno di questi funzioni, è necessario accedere al contenitore, quindi è necessario estendere lo WebTestCase o eseguire il rollover della propria capacità di avviare il kernel (vedere here).

Ho la sensazione di aver capito male la domanda (ad esempio, devi fare qualcosa di più complesso del semplice posizionamento del token). Forse si potrebbe tentare di chiarire un po 'più di quello che si intende per

passaggio o fingendo un account di accesso

Un esempio concreto di piantare un token di sicurezza in un test:

Per prima cosa creare una classe base per i nostri test da utilizzare che contenga un metodo di accesso pratico. Questo può essere fatto estendendo WebTestCase e utilizzando il metodo getContainer su un client O si può tirare WebTestCase a parte per rotolare la propria classe di base che ha appena avviato il kernel senza un cliente e restituisce il contenitore (vedi il mio link per due soluzioni utilizzate ai fini che) .

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); 
    } 

} 

Quindi è sufficiente utilizzare la classe base in qualsiasi test desiderato. In questo modo:

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. 
    } 

} 

Speriamo che questo aiuta.

+0

Penso che tu abbia capito bene, ci posso provare più tardi. Voglio solo falsificare un accesso in modo da poter testare la mia logica ACL. –

+0

Speriamo che ti possa aiutare :) Per testare ACL utilizzare il mio secondo frammento. Ottieni prima la tua entità '$ user' da' EntityManager' o 'Repository' e passala al token come' $ user'. – Kasheen

+0

Ok, ho appena provato questo aggiornamento ... Sto ricevendo 'Non esiste un provider utente per l'utente" Bottle \ Bundle \ NotesBundle \ Entity \ User "' now. Ho effettivamente creato un 'FakeUserToken' personalizzato, forse dovrei usare UsernamePasswordToken? Stavo cercando di essere il più vicino possibile alla cosa reale in cui posso ottenere l'utente che ha effettuato l'accesso. Come posso farlo con 'UsernamePasswordToken'? –

1

Non sicuro di aver capito la tua domanda molto bene, ma se si desidera solo per vedere l'applicazione con diversi ruolo utente è possibile utilizzare lo Switcher ruolo Symfony documentato qui: http://symfony.com/doc/current/book/security.html#impersonating-a-user

Quindi, devi solo mettere un parametro in il tuo url per visualizzare la tua app come un altro utente connesso.

Spero che aiuti!

+1

Credo che per questo devo prima accedere come amministratore –