Я просто просмотрел этот учебник: 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, но есть более простой способ: