Wie kann man einen Benutzer programmgesteuert anmelden/authentifizieren

Wie man sich in Controller anmeldet

Um sich anzumelden, müssen Sie folgende Schritte durchführen:

  1. Benutzer aus der Datenbank erhalten
  2. Token generieren
  3. Sicherheitskontext aktualisieren
  4. Login-Event einplanen
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()

class SomeController extends Controller
{
    public function someAction()
   {
        // Holen Sie den Benutzer aus der Datenbank
        $user = $this->get('doctrine')->getRepository('SomeUserBundle:User')->findOneByUsername($username);
        // Hier ist "public" der Name der Firewall in  security.yml
        $token = new UsernamePasswordToken($user, $user->getPassword(), "public", $user->getRoles());
        $this->get("security.context")->setToken($token);

        // Entlassen Sie das Login-Ereignis
        // Wenn Sie den Benutzer durch die Art und Weise einloggen, wie wir es tun, geschieht das nicht automatisch
        $event = new InteractiveLoginEvent($request, $token);
        $this->get("event_dispatcher")->dispatch("security.interactive_login", $event);
   }
}

Wie kann man in Tests mit HWIOAuthBundle arbeiten

Wenn Sie HWIOAuthBundle verwenden und einen Benutzer programmgesteuert anmelden/authentifizieren wollen, dann können Sie folgenden Code verwenden. Lassen Sie uns zunächst eine Basisklasse für unsere Tests erstellen und dann jede Testklasse daraus erweitern. Um die Anmeldung zu simulieren, rufen Sie einfach die übergeordnete Klassenmethode "login" in einer beliebigen Funktion auf.

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