我在为新的Symfony2应用程序验证用户时遇到问题。
此应用程序通过API获取所有信息,因此不使用任何数据库。当用户进入登录页面时,他会在登录表单中介绍用户和密码。然后,我必须使用API调用来验证他。如果该API调用不是用户,则返回“false”,如果是正确的用户,则返回令牌密钥和令牌密钥。使用此令牌密钥和密钥,在用户会话期间,我可以生成渲染应用程序的所有页面所需的所有API请求。一旦用户会话结束并且令牌密钥和密钥被删除,用户就必须再次登录。
我真的不知道如何实现这一点。我读了http://symfony.com/doc/current/cookbook/security/custom_provider.html和http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html,我还是迷路了...... :(
任何人都可以帮助我吗?
非常感谢你:)
答案 0 :(得分:4)
如果您想编写自定义身份验证,您已找到正确的链接。作为示例,您可以看到OAuth授权HWIOAuthBundle的实现。但请记住,此类身份验证会在您的系统上创建用户。如果您不使用数据库,则每次用户发送请求时都必须向API发出请求。
首先,您需要了解没有魔法。在每个请求中,symfony都会检查url是否与指定的防火墙之一匹配(请参阅secutity.yml)。解雇你的监听器可以在防火墙工厂中看到。如果找到匹配项,则操作将切换到相应的AuthenticationListener。监听器尝试通过创建令牌来验证凭证,该令牌被发送到AuthenticationProvider
$this->authenticationManager->authenticate(new UsernamePasswordToken($username, $password, $this->providerKey));
在AuthenticationProvider中
public function authenticate(TokenInterface $token) {
...
}
AuthenticationProvider尝试通过UserProvider获取用户。如果成功,Token存储在会话中。在后续请求中,ContextListener首先进入游戏,检查会话,提取令牌并将其发送到AuthenticationProvider类似。
一般而言,该计划看起来像那样。您可以找到更多信息,检查Symfony Security组件的源代码。
真正好的起点是UsernamePasswordFormAuthenticationListener。它只需要从请求中获取登录名和密码,并制作最简单的UsernamePasswordToken。
protected function attemptAuthentication(Request $request)
{
...
}
祝你好运!