From a9dc1aa6c9ac162c876679bf15285d310bb54e29 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Fri, 13 Mar 2026 18:51:55 +0100 Subject: [PATCH 1/7] InteractiveLoginSubscriber.php: Use UsernameProvider --- .../user_management/in_memory/config/services.yaml | 1 + .../EventSubscriber/InteractiveLoginSubscriber.php | 11 +++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code_samples/user_management/in_memory/config/services.yaml b/code_samples/user_management/in_memory/config/services.yaml index 83124bea6a..b4783d8871 100644 --- a/code_samples/user_management/in_memory/config/services.yaml +++ b/code_samples/user_management/in_memory/config/services.yaml @@ -1,6 +1,7 @@ services: App\EventSubscriber\InteractiveLoginSubscriber: arguments: + $userProvider: '@ibexa.security.user_provider.username' $userMap: from_memory_user: customer from_memory_admin: admin diff --git a/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php b/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php index ac000c0439..25374d9633 100644 --- a/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php +++ b/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php @@ -1,11 +1,10 @@ $userMap */ public function __construct( - private readonly UserService $userService, + private readonly UserProviderInterface $userProvider, private readonly array $userMap = [], ) { } @@ -30,8 +29,8 @@ public function onInteractiveLogin(InteractiveLoginEvent $event): void $tokenUser = $event->getAuthenticationToken()->getUser(); if ($tokenUser instanceof InMemoryUser) { $userLogin = $this->userMap[$event->getAuthenticationToken()->getUserIdentifier()] ?? 'anonymous'; - $ibexaUser = $this->userService->loadUserByLogin($userLogin); - $event->getAuthenticationToken()->setUser(new User($ibexaUser)); + $wrappedUser = $this->userProvider->loadUserByIdentifier($userLogin); + $event->getAuthenticationToken()->setUser($wrappedUser); } } } From c7af8dd0bc924be1ff068296e39790f53d604f93 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Fri, 13 Mar 2026 18:55:16 +0100 Subject: [PATCH 2/7] Apply suggestion from @adriendupuis --- .../src/EventSubscriber/InteractiveLoginSubscriber.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php b/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php index 25374d9633..9ef6198ea0 100644 --- a/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php +++ b/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php @@ -1,6 +1,6 @@ Date: Mon, 16 Mar 2026 09:55:20 +0100 Subject: [PATCH 3/7] InteractiveLoginSubscriber: Fix PHPStan missingType.generics --- .../src/EventSubscriber/InteractiveLoginSubscriber.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php b/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php index 9ef6198ea0..45ec65fbf6 100644 --- a/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php +++ b/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php @@ -10,7 +10,10 @@ class InteractiveLoginSubscriber implements EventSubscriberInterface { - /** @param array $userMap */ + /** + * @param array $userMap + * @phpstan-param UserProviderInterface<\Ibexa\Core\MVC\Symfony\Security\UserInterface> $userProvider + */ public function __construct( private readonly UserProviderInterface $userProvider, private readonly array $userMap = [], From d25c16495bb17b58afd2c84645b625a66fa3bde2 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Mon, 16 Mar 2026 09:57:06 +0100 Subject: [PATCH 4/7] Revert "deptrac.baseline.yaml: Ignore InteractiveLoginSubscriber Security\User" This reverts commit daec0d1955fe4b87f0ed0bccfe10b5f4a8bb4152. --- deptrac.baseline.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/deptrac.baseline.yaml b/deptrac.baseline.yaml index 260eb476fa..c1f699e7fa 100644 --- a/deptrac.baseline.yaml +++ b/deptrac.baseline.yaml @@ -102,8 +102,6 @@ deptrac: - Ibexa\FormBuilder\Event\FormEvents App\EventSubscriber\HelpMenuSubscriber: - Ibexa\AdminUi\Menu\Event\ConfigureMenuEvent - App\EventSubscriber\InteractiveLoginSubscriber: - - Ibexa\Core\MVC\Symfony\Security\User App\EventSubscriber\MyMenuSubscriber: - Ibexa\AdminUi\Menu\Event\ConfigureMenuEvent - Ibexa\AdminUi\Menu\MainMenuBuilder From bd598210bdf47c182e70fdd1ca1c755d41e4a741 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Mon, 16 Mar 2026 09:57:44 +0100 Subject: [PATCH 5/7] user_authentication: Adapt to UsernameProvider usage --- docs/users/user_authentication.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/users/user_authentication.md b/docs/users/user_authentication.md index a649b269bb..98fb45e107 100644 --- a/docs/users/user_authentication.md +++ b/docs/users/user_authentication.md @@ -26,8 +26,9 @@ The following example uses the [memory user provider]([[= symfony_doc =]]/securi maps memory user to Ibexa repository user, and [chains]([[= symfony_doc =]]/security/user_providers.html#chain-user-provider) with the Ibexa user provider to be able to use both: -Create as `src/EventSubscriber/InteractiveLoginSubscriber.php` subscribing to the `SecurityEvents::INTERACTIVE_LOGIN` event -and mapping when needed an in-memory authenticated user to an Ibexa user: +Create as `src/EventSubscriber/InteractiveLoginSubscriber.php` subscribing to the `SecurityEvents::INTERACTIVE_LOGIN` event, +mapping when needed an in-memory authenticated user to an Ibexa user, +and using the Ibexa `UsernameProvider` implementation of `UserProviderInterface::loadUserByIdentifier()` to have a repository user wrapped into a security user: ``` php [[= include_file('code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php') =]] From 4fd4a599cd843b37a552946ef1f3d528b092af27 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Mon, 16 Mar 2026 09:59:06 +0100 Subject: [PATCH 6/7] better variable naming Co-authored-by: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> --- .../src/EventSubscriber/InteractiveLoginSubscriber.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php b/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php index 45ec65fbf6..c256dbec29 100644 --- a/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php +++ b/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php @@ -32,8 +32,8 @@ public function onInteractiveLogin(InteractiveLoginEvent $event): void $tokenUser = $event->getAuthenticationToken()->getUser(); if ($tokenUser instanceof InMemoryUser) { $userLogin = $this->userMap[$event->getAuthenticationToken()->getUserIdentifier()] ?? 'anonymous'; - $wrappedUser = $this->userProvider->loadUserByIdentifier($userLogin); - $event->getAuthenticationToken()->setUser($wrappedUser); + $ibexaSecurityUser = $this->userProvider->loadUserByIdentifier($userLogin); + $event->getAuthenticationToken()->setUser($ibexaSecurityUser); } } } From 91f79ceaef5e2922685b4b08699613d4e7fbeac9 Mon Sep 17 00:00:00 2001 From: adriendupuis Date: Mon, 16 Mar 2026 09:14:28 +0000 Subject: [PATCH 7/7] PHP & JS CS Fixes --- .../in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php | 1 + 1 file changed, 1 insertion(+) diff --git a/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php b/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php index 7a13de8e27..f792727794 100644 --- a/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php +++ b/code_samples/user_management/in_memory/src/EventSubscriber/InteractiveLoginSubscriber.php @@ -12,6 +12,7 @@ class InteractiveLoginSubscriber implements EventSubscriberInterface { /** * @param array $userMap + * * @phpstan-param UserProviderInterface<\Ibexa\Core\MVC\Symfony\Security\UserInterface> $userProvider */ public function __construct(