0

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

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

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

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

4

1 回答 1

1

我通过用户名和电子邮件归档了身份验证,唯一必须做的就是为图书馆提供另一个用户提供者。您只需要一个实现 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 }
于 2019-01-31T13:22:13.487 回答