как реализовать аутентификацию с именем пользователя или электронной почтой - PullRequest
0 голосов
/ 31 января 2019

Я реализовал пакет lexik jwt для symfony 2.8 в своем приложении и пытаюсь использовать его с логином или адресом электронной почты, но я никак не мог это сделать.

bundle работает правильно, но я не смог настроить его для аутентификации по электронной почте или по имени пользователя, и я не нашел примеров того, как это сделать через документацию или Интернет.

мой код похож наДокументация показывает, я пытался реализовать его, начиная с JWTTokenValidator, но я не смог подойти.

Как я могу настроить его для обеспечения аутентификации пользователя по электронной почте или по имени пользователя и паролю?

1 Ответ

0 голосов
/ 31 января 2019

Я заархивировал аутентификацию по имени пользователя и электронной почте, единственное, что нужно сделать, - это предоставить другому провайдеру пользователя библиотеку.Вам нужен только класс, который реализует UserProviderInterface, в частности метод loadUserByUsername с вашей пользовательской логикой аутентификации.А затем внедрить его как зависимость в службу lexik jwt.например:

 class AuthUserProvider implements UserProviderInterface
{

    /**
     * @var UserRepository
     */
    private $userManager;

    public function __construct(UserManager $userManager)
    {
        $this->userManager = $userManager;
    }

    public function loadUserByUsername($username)
    {
        $foundedUser = $this->userManager->findUserByUsernameOrEmail($username);

        if ($foundedUser === null) {
            throw new UsernameNotFoundException();
        }

        return $foundedUser;
    }

    public function refreshUser(UserInterface $user)
    {
        // TODO: Implement refreshUser() method.
    }

    public function supportsClass($class)
    {
        // TODO: Implement supportsClass() method.
    }
}

мой пакет service.yml выглядит следующим образом:

api_bundle.security.auth_user_provider:
        class: Project\TheOwn\ApiBundle\Security\AuthUserProvider
        arguments:
            - '@the_own.core.manager.user'
        public: true

и мой security.yml:

security:
encoders:
    FOS\UserBundle\Model\UserInterface: sha512

providers:
    auth_user_provider:
        id: api_bundle.security.auth_user_provider
firewalls:
    login:
        pattern:  ^/api/signin
        stateless: true
        anonymous: true
        provider: auth_user_provider
        form_login:
            check_path:               /api/signin
            success_handler:          lexik_jwt_authentication.handler.authentication_success
            failure_handler:          lexik_jwt_authentication.handler.authentication_failure
            require_previous_session: false

    api:
        pattern: ^/api/
        security: true
        stateless: true
        provider: auth_user_provider
        guard:
            authenticators:
                - lexik_jwt_authentication.jwt_token_authenticator

access_control:
    - { path: ^/api/signin, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api,       roles: IS_AUTHENTICATED_FULLY }
...