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.
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. –
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
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'? –