symfony2 программно аутентифицирует пользователя

Я просто просмотрел этот учебник: http://symfony.com/doc/current/cookbook/security/api_key_authentication.html (включая «Сохранение аутентификации в сеансе»)

Он работает и авторизует пользователей с помощью ключа api и успешно сохраняет аутентификацию в сеансе.

Но у меня нет никаких идей, как программно аутентифицировать пользователя через этот метод аутентификации.

Я пробовал что-то вроде:

$user = new User( 'admin', null, ['ROLE_ADMIN'] ); $token = new PreAuthenticatedToken($user, null, "secured_area", $user->getRoles()); $this->get("security.token_storage")->setToken($token); $request = $this->get("request"); $event = new InteractiveLoginEvent($request, $token); $this->get("event_dispatcher")->dispatch("security.interactive_login", $event); 

но похоже, что он использовал неверный поставщик аутентификации.

Может ли кто-нибудь сказать мне, что я делаю неправильно? (:

Обновлено:

Когда проверка подлинности выполнялась по методу выше, маркер сеанса хранится в брандмауэре по умолчанию.

 security: providers: api_key_user_provider: id: api_key_user_provider firewalls: dev: pattern: ^/(_(profiler|wdt|error)|css|images|js)/ security: false secured_area: pattern: ^/admin simple_preauth: authenticator: apikey_authenticator default: anonymous: ~ 

Почему вместо использования брандмауэра secure4area он использует «default»? Как правильно принудительно использовать «secure_area»?

ваше создание пользователя неверно, вы должны использовать диспетчер пользователей:

 $userManager = $this->container->get('fos_user.user_manager'); // Create our user and set details $user = $userManager->createUser(); $user->setUsername('username'); $user->setEmail('email@domain.com'); $user->setPlainPassword('password'); //$user->setPassword('encrypted_password'); $user->setEnabled(true); $user->setRoles(array('ROLE_ADMIN')); // Update the user $userManager->updateUser($user, true); 

Затем вы можете аутентифицировать пользователя следующим образом:

 $token = new UsernamePasswordToken( $user, $user->getPassword(), 'secured_area', $user->getRoles() ); $this->get('security.context')->setToken($token); $request->getSession()->set('_security_secured_area', serialize($token)); 

Редактировать :

 $token = new UsernamePasswordToken($user, $user->getPassword(), "secured_area", $user->getRoles()); $this->get("security.context")->setToken($token); $event = new InteractiveLoginEvent($request, $token); $this->get("event_dispatcher")->dispatch("security.interactive_login", $event); 

Вы можете сделать это, как это, более обычным способом, сообщите мне, помогает ли это правильному брандмауэру.

btw Я не уверен, что это уже в вашей версии symfony, но есть более простой способ:

https://github.com/symfony/symfony/pull/13062