我有一个应用程序,其中登录过程针对外部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需要数据库中的用户。我的应用程序没有用户数据库。有没有办法在没有它的情况下登录用户。
答案 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