ContextListener provider-> refreshUser()为NULL

时间:2019-02-25 18:46:02

标签: symfony token roles

我分叉了一个库,并对它进行了很多更改。当我使用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;
}

0 个答案:

没有答案
相关问题