在没有数据库的Symfony 3中验证用户

时间:2018-03-08 14:24:15

标签: php api symfony user-interface symfony-3.3

我有一个应用程序,其中登录过程针对外部API运行。 API为我提供了一个JSON,我将其存储在User Enitiy中。(称之为会员)

用户类实现 AdvancedUserInterface

我的登录Prozess。

    $firewall = 'main';
    $token = new UsernamePasswordToken($member, null, $firewall, $member->getRoles());
    $this->tokenStorage->setToken($token);
    $this->session->set('_security_'.$firewall, serialize($token));

    $request = new \Symfony\Component\HttpFoundation\Request();

    $event = new InteractiveLoginEvent($request, $token);
    $this->eventDispatcher->dispatch("security.interactive_login", $event);

但这样做不会起作用。现在我读了here这个Prozess需要数据库中的用户。我的应用程序没有用户数据库。有没有办法在没有它的情况下登录用户。

1 个答案:

答案 0 :(得分:1)

您可以定义自定义防护身份验证器:How to Create a Custom Authentication System with Guard。我将在这里快速介绍主要步骤,但请查看链接,因为它更深入地解释了这些步骤。

首先,您需要创建用户类和相应的用户提供程序。看起来你已经做到了。如果您以后不在身份验证器类中使用它,也可以跳过用户提供程序类(或创建一个伪造的类)。

接下来创建您的Authenticator类(比如说AppBundle\Security\ExternalApiAuthenticator)。它只是一个普通的symfony服务,扩展了Symfony\Component\Security\Guard\AbstractGuardAuthenticator。关于该课程的评论非常擅长解释如何实现它,你应该检查它们,但有人认为这可能有用:您可以使用getUser方法中的API检查凭据,然后始终返回checkCredentials中为true。

最后将一些配置添加到app/config/security.yml

# app/config/security.yml
security:
    # ...

    firewalls:
        # ...

        main:
            anonymous: ~
            logout: ~

            guard:
                authenticators:
                    - AppBundle\Security\ExternalApiAuthenticator