Как войти через имя пользователя или электронную почту, используя пакет LexikJWT для symfony5? - PullRequest
0 голосов
/ 07 февраля 2020

Я использую LexikJWT и GraphQL для своего API symfony5, но я не знаю, как настроить приложение для входа в систему с помощью имени пользователя или электронной почты.

Это мои security.yaml и lexik_jwt_authentication.yaml

// security.yaml
security:
    encoders:
        App\Entity\User:
            algorithm: auto

    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    providers:
        # used to reload user from session & other features (e.g. switch_user)
        app_user_provider:
            entity:
                class: App\Entity\User
                property: username
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            anonymous: true
            stateless: true
            guard:
                authenticators:
                    - lexik_jwt_authentication.jwt_token_authenticator

// lexik_jwt_authentication.yaml
lexik_jwt_authentication:
    secret_key: '%env(resolve:JWT_SECRET_KEY)%'
    public_key: '%env(resolve:JWT_PUBLIC_KEY)%'
    pass_phrase: '%env(JWT_PASSPHRASE)%'
    token_ttl: 604800
    user_identity_field: username

1 Ответ

0 голосов
/ 05 марта 2020

Вы можете реализовать пользовательский провайдер. Пример:

class UserRepository extends ServiceEntityRepository implements UserLoaderInterface 
{
 public function __construct(ManagerRegistry $registry)
 {
    parent::__construct($registry, User::class);
 }

/**
 * Loads the user for the given username.
 *
 * This method must return null if the user is not found.
 *
 * @param $usernameOrEmail
 * @return UserInterface|null
 * @throws \Doctrine\ORM\NonUniqueResultException
 */
public function loadUserByUsername($usernameOrEmail)
{
    return $this->createQueryBuilder('u')
        ->where('u.username = :query OR u.email = :query')
        ->setParameter('query', $usernameOrEmail)
        ->getQuery()
        ->getOneOrNullResult();

}
}
...