我分叉了一个库,并对它进行了很多更改。当我使用Steam进行身份验证时,它会正确保存到数据库,并出现类似“对成员函数getUsername()的调用为null”之类的错误
从TokenInterface $ token,我可以使用$ token-> getUser()打印,它可以正常工作。我被卡住了,真的不知道问题出在哪里。我会给你一些可能有错误的可疑代码。
security.yaml
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
pattern: ^/
provider: steam_user_provider
steam: true
logout:
path: /logout
target: /
user.php
public function __construct()
{
$this->roles = [];
}
/**
* @return array
*/
public function getRoles(): array
{
$roles = [];
foreach ($this->roles as $role) {
$roles[] = new Role($role);
}
return $roles;
}
SteamProvider
class SteamProvider implements AuthenticationProviderInterface
{
/**
* @var UserProviderInterface
*/
private $userProvider;
/**
* @param UserProviderInterface $userProvider
*/
public function __construct(UserProviderInterface $userProvider)
{
$this->userProvider = $userProvider;
}
/**
* {@inheritdoc}
*/
public function authenticate(TokenInterface $token)
{
$user = $this->userProvider->loadUserByUsername($token->getUsername());
$authenticatedToken = new SteamUserToken();
$authenticatedToken->setUser($user);
$authenticatedToken->setUsername($user->getUsername());
$authenticatedToken->setAuthenticated(true);
return $authenticatedToken;
}
/**
* {@inheritdoc}
*/
public function supports(TokenInterface $token)
{
return $token instanceof SteamUserToken;
}
}
ContextListener。 (错误显示在这里)
$token->setUser($refreshedUser);
if (null !== $this->logger) {
$context = ['provider' => \get_class($provider),
'username' => $refreshedUser->getUsername()];
foreach ($token->getRoles() as $role) {
if ($role instanceof SwitchUserRole) {
$context['impersonator_username'] = $role-
>getSource()->getUsername();
break;
}
}
我很抱歉这个智障的问题。但我不知道为什么会发生此错误。确实$ token-> getUser()可以完美地工作,但是在provider-> refreshUser($ token-> getUser())中给出的是NULL值。角色可能有错误,但真的不知道。如果您需要有关我的代码的更多示例,请问我。感谢您的帮助
添加SteamUserProvider以获得更多信息
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var SteamApiClient
*/
private $api;
/**
* @var string
*/
private $userClass;
/**
* @var UserFactory
*/
private $userFactory;
/**
* @param EntityManagerInterface $entityManager
* @param SteamApiClient $steamApiClient
* @param string $userClass
* @param UserFactory $userFactory
*/
public function __construct(
EntityManagerInterface $entityManager,
SteamApiClient $steamApiClient,
string $userClass,
UserFactory $userFactory
)
{
$this->entityManager = $entityManager;
$this->api = $steamApiClient;
$this->userClass = $userClass;
$this->userFactory = $userFactory;
}
/**
* {@inheritdoc}
*/
public function loadUserByUsername($username)
{
$user = $this->entityManager->getRepository($this->userClass)-
>findOneBy(['steamId' => $username]);
$userData = $this->api->loadProfile($username);
if (null === $user) {
$user = $this->userFactory->getFromSteamApiResponse($userData);
$this->entityManager->persist($user);
} else {
$user->update($userData);
}
$this->entityManager->flush();
return $user;
}
/**
* {@inheritdoc}
*/
public function refreshUser(UserInterface $user)
{
if (!$user instanceof SteamUserInterface) {
throw new UnsupportedUserException();
}
return $this->entityManager->getRepository($this->userClass)-
>findOneBy(['steamId' => $user->getSteamId()]);
}
/**
* {@inheritdoc}
*/
public function supportsClass($class)
{
return $class === $this->userClass;
}