Comment connecter / authentifier par programme un utilisateur
Comment dans le contrôleur
Pour vous connecter, vous devez suivre les étapes suivantes
- obtenir l'utilisateur de la base de données
- générer un jeton
- mettre à jour le contexte de sécurité
- événement de connexion d'expédition
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
class SomeController extends Controller
{
public function someAction()
{
// get user from database
$user = $this->get('doctrine')->getRepository('SomeUserBundle:User')->findOneByUsername($username);
// Here, "public" is the name of the firewall in your security.yml
$token = new UsernamePasswordToken($user, $user->getPassword(), "public", $user->getRoles());
$this->get("security.context")->setToken($token);
// Fire the login event
// Logging the user in above the way we do it doesn't do this automatically
$event = new InteractiveLoginEvent($request, $token);
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event);
}
}
Comment dans les tests utilisant HWIOAuthBundle
Si vous utilisez HWIOAuthBundle et que vous souhaitez vous connecter / authentifier par programme, vous pouvez utiliser le code suivant. Tout d'abord, créons une classe de base pour nos tests, puis étendons chaque classe de test à partir de celle-ci. Pour simuler la connexion, appelez simplement la méthode de classe parent "login" dans n'importe quelle fonction.
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\BrowserKit\Cookie;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use HWI\Bundle\OAuthBundle\Security\Core\Authentication\Token\OAuthToken;
use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthUser;
/**
*
* This class is used to login to the system an test user's feature.
*
*/
abstract class BaseCredentialsTest extends WebTestCase
{
/**
*
* @var \Symfony\Bundle\FrameworkBundle\Client
*/
protected $client = null;
/**
*
*/
public function setUp()
{
$this->client->insulate();
}
protected function logIn()
{
$token = new OAuthToken('test', array( 'ROLE_MODERATOR'));
// get user from doctrine
$username = 'someusername';
$user = $this->client->getContainer()->get('doctrine')->getRepository('SomeUserBundle:User')->findOneByUsername($username);
//
$token->setUser($user);
$session = $this->client->getContainer()->get('session');
$session->set('_security_public', serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
}