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

时间:2019-01-31 00:01:17

标签: symfony jwt symfony-2.8 lexikjwtauthbundle

我在我的应用程序中实现了symfony 2.8的lexik jwt捆绑软件,我试图将其与用户登录名或电子邮件一起使用,但是我仍然无法以任何方式进行操作。

该捆绑包可以正常工作,但是我无法对其进行配置以使其能够通过电子邮件或用户名进行身份验证,并且我还没有找到如何通过文档或Internet进行验证的示例。

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

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

1 个答案:

答案 0 :(得分:0)

我通过用户名和电子邮件归档了auth,唯一要做的就是为库提供另一个用户提供程序。 您只需要一个实现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 }