【问题标题】:Problems configuring user authentication by external API on Symfony2Symfony2 上通过外部 API 配置用户身份验证的问题
【发布时间】:2012-12-25 04:52:24
【问题描述】:

我在为我的新 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,我还是很迷茫……:(

谁能帮帮我?

非常感谢:)

【问题讨论】:

标签: api authentication symfony external


【解决方案1】:

如果您想编写自定义身份验证,您已经找到了正确的链接。作为示例,您可以看到 OAuth 授权 HWIOAuthBundle 的实现。但请记住,这种类型的身份验证会在您的系统上创建一个用户。如果不使用数据库,则每次用户发送请求时都必须向 API 发出请求。

首先你需要明白没有魔法。在每个请求中,symfony 都会检查 url 是否与指定的防火墙之一匹配(参见 secutity.yml)。触发的监听器可以在防火墙工厂中看到。如果找到匹配项,则操作切换到相应的AuthenticationListener。 Listener 尝试通过创建 Token 来验证凭证,该 Token 被发送到AuthenticationProvider

$this->authenticationManager->authenticate(new UsernamePasswordToken($username, $password, $this->providerKey));

在 AuthenticationProvider 中

public function authenticate(TokenInterface $token) {
    ...
}

AuthenticationProvider 尝试通过 UserProvider 获取用户。在成功的情况下,Token 存储在会话中。在随后的请求中,ContextListener 首先发挥作用,检查会话,提取令牌并将其发送给类似的 AuthenticationProvider。

一般来说,该方案看起来像这样。查看 Symfony 安全组件的源代码,您可以找到更多信息。

真正好的起点是UsernamePasswordFormAuthenticationListener。它只是从请求中获取登录名和密码,并制作最简单的 UsernamePasswordToken。

protected function attemptAuthentication(Request $request)
{
    ...
}

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2016-11-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多