如何使用用户名或电子邮件实现身份验证

how to implements auth with username or email

我在我的应用程序中为 symfony 2.8 实现了 lexik jwt 包,我试图通过用户登录或电子邮件使用它,但我无法以任何方式做到这一点。

捆绑包工作正常,但我无法将其配置为能够通过电子邮件或用户名进行身份验证,而且我还没有通过文档或互联网找到如何执行此操作的示例。

我的代码就像文档显示的那样,我试图从 JWTTokenValidator 扩展实现它,但我无法接近。

如何配置它以通过电子邮件或用户名和密码实现用户身份验证?

我通过用户名和电子邮件存档了身份验证,唯一必须做的就是向图书馆提供另一个用户提供者。 您只需要一个实现 UserProviderInterface 的 class,特别是具有自定义身份验证逻辑的 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 }