symfony3で私の最初のAPIログインをビルドしていますが、ログインリスナーにトリップしました。私は、ユーザーがログの書き込み、トークンの生成など、さまざまな通常の目的のために正常にログインした時点でイベントを発生させたいと考えています。 ログインシステムはAPIを介して行われているため、 symfonyガイドに記載されている古典的なログインフォーム。この光で、私は逃した何かがあると確信しています。ログイン後にsymfony 3リスナーが実行されない
リスナーの初期化:
// config/services.yml
//...
login_listener:
class: 'User\LoginBundle\Listener\LoginListener'
tags:
- { name: 'kernel.event_listener', event: 'security.interactive_login', method: onSecurityInteractiveLogin }
マイリスナー:
// User/LoginBundle/Listener/LoginListener.php
namespace User\LoginBundle\Listener;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
class LoginListener
{
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
echo 'Hello, I am the login listener!!';
}
}
私のコントローラクラス
// User/LoginBundle/Controller/LoginController.php
//...
public function checkCredentialsAction(Request $request)
{
$recursiveValidator = $this->get('validator');
$user = new User;
$user->setUsername($request->request->get('username'));
$user->setPassword($request->request->get('password'));
$errors = $recursiveValidator->validate($user);
if (count($errors) > 0) {
$errorsString = (string) $errors;
return new JsonResponse($errorsString);
}
$loginService = $this->get('webserviceUserProvider.service');
$user = $loginService->loadUserByUsernameAndPassword(
$request->get('username'),
$request->get('password')
);
if ($user instanceof WebserviceUser) {
return new JsonResponse('all right');
}
return new JsonResponse('Username/password is not valid', 403);
}
マイセキュリティコンポーネント
security:
# https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
providers:
in_memory:
memory: ~
api_key_user_provider:
id: AppBundle\Security\ApiKeyUserProvider
# property: apiKey
user_db_provider:
entity:
class: UserUserBundle:User
# property: username
webservice:
id: User\UserBundle\Security\User\WebserviceUserProvider
encoders:
User\UserBundle\Entity\User:
algorithm: bcrypt
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
user_logged:
pattern: ^/logged
stateless: true
simple_preauth:
authenticator: AppBundle\Security\ApiKeyAuthenticator
provider: api_key_user_provider
main:
anonymous: ~
form_login:
check_path: login/check
access_control:
- { path: ^/login/check, roles: IS_AUTHENTICATED_ANONYMOUSLY }
このようにエンティティに対して検証が実行され、ユーザー/パスワードが有効な場合、返されるjsonはreturn new JsonResponse('all right, you are logged in');
です。検証は、ユーザーとパスワードが有効で、ログインが発生したときに、リスナーは考慮されないのはなぜサービス(それはthisにかなり似ている方法loadUserByUsernameAndPassword
、)、
としてインスタンス化カスタムユーザプロバイダクラスで行われていますinteractive_login
イベントを発動させる有効なイベントですか?
このプロジェクトではセキュリティコンポーネントが使用されていないようです:) –
実際にどこにログインしているのかわかりません。たとえば、トークン・ストレージが更新される場所はどこですか? – Cerad
@ MaxP。私はsecurity.ymlで投稿を更新しました。 –