Wie kann man einen Benutzer programmgesteuert anmelden/authentifizieren
Wie man sich in Controller anmeldet
Um sich anzumelden, müssen Sie folgende Schritte durchführen:
- Benutzer aus der Datenbank erhalten
- Token generieren
- Sicherheitskontext aktualisieren
- 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);
}
}