LoginFormAuthenticator::getUser()" 方法必须返回用户界面



为了尝试重构类表继承中的实体以分离用户类型类,我遇到了这种情况:

"App\Security\LoginFormAuthenticator::getUser()"方法必须 返回用户界面。您返回了"数组"。

从文档中,我配置了用户提供程序链。我不知所措。对于自定义用户提供程序,我找到了Symfony的ChainUserProvider,但是将其集成到流程中根本不清楚。security.yaml不喜欢将其包含在firewalls.main.providerproviders.all_users的任何地方

当然还有其他东西要补充,但是什么和在哪里?

security.yaml:

security:
encoders:
AppEntityAdmin:
algorithm: auto
AppEntityRepresentative:
algorithm: auto
AppEntityVolunteer:
algorithm: auto
role_hierarchy:
ROLE_SUPER_ADMIN: [ROLE_ADMIN]
providers:
# used to reload user from session & other features (e.g. switch_user)
admin_provider:
entity:
class: 'AppEntityAdmin'
property: email
representative_provider:
entity:
class: 'AppEntityRepresentative'
property: email
volunteer_provider:
entity:
class: 'AppEntityVolunteer'
property: email
all_users:
chain:
providers: ['admin_provider', 'representative_provider', 'volunteer_provider']
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
provider: all_users
user_checker: AppSecurityUserChecker
anonymous: ~
guard:
authenticators:
- AppSecurityLoginFormAuthenticator
logout:
path:   app_logout
target: /
remember_me:
secret:   '%kernel.secret%'
lifetime: 604800 # 1 week in seconds
path:     /
access_control:
- { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, roles: ROLE_ADMIN }

并修改了用户检查器:

use AppEntityAdmin;
use AppEntityRepresentative;
use AppEntityVolunteer;
use SymfonyComponentSecurityCoreExceptionCustomUserMessageAuthenticationException;
use SymfonyComponentSecurityCoreUserUserCheckerInterface;
use SymfonyComponentSecurityCoreUserUserInterface;
class UserChecker implements UserCheckerInterface
{
public function checkPreAuth(UserInterface $user)
{
if (!$user instanceof Admin && !$user instanceof Representative && !$user instanceof Volunteer) {
return;
}
}
public function checkPostAuth(UserInterface $user)
{
if (!$user instanceof Admin && !$user instanceof Representative && !$user instanceof Volunteer) {
return;
}
...
}

并修改了登录表单身份验证器:

public function getUser($credentials, UserProviderInterface $userProvider)
{
$token = new CsrfToken('authenticate', $credentials['csrf_token']);
if (!$this->csrfTokenManager->isTokenValid($token)) {
throw new InvalidCsrfTokenException();
}
$admin = $this->entityManager->getRepository(Admin::class)->findBy(['email' => $credentials['email']]);
$rep = $this->entityManager->getRepository(Representative::class)->findBy(['email' => $credentials['email']]);
$vol = $this->entityManager->getRepository(Volunteer::class)->findBy(['email' => $credentials['email']]);
$user = $admin ?? $rep ?? $vol ?? null;
if (!$user) {
// fail authentication with a custom error
throw new CustomUserMessageAuthenticationException('Credentials could not be found.');
}
return $user;
}

问题是 Doctrine 存储库方法findBy返回一个数组,因此您尝试在此处获取用户的结果是数组:

$admin = $this->entityManager->getRepository(Admin::class)->findBy(['email' => $credentials['email']]);
$rep = $this->entityManager->getRepository(Representative::class)->findBy(['email' => $credentials['email']]);
$vol = $this->entityManager->getRepository(Volunteer::class)->findBy(['email' => $credentials['email']]);
$user = $admin ?? $rep ?? $vol ?? null;

由于我假设您在通过电子邮件搜索时只期望一个用户,因此您可以将其替换为findOneBy,这将返回一个对象或 null。

相关内容

最新更新