Comment connecter / authentifier par programme un utilisateur

Comment dans le contrôleur

Pour vous connecter, vous devez suivre les étapes suivantes

  1. obtenir l'utilisateur de la base de données
  2. générer un jeton
  3. mettre à jour le contexte de sécurité
  4. é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);
	}
}