FOSFacebookBundle:注册前选择用户名

时间:2012-02-27 17:23:18

标签: symfony fosuserbundle

我使用这种方法安装了FOSUserBundle和FOSFacebookBundle:How to make a separate url for signin via Facebook using FOSFacebookBundle in Symfony2。实际上我并不是真的了解整个安全事务过程,但它现在工作正常。

当有人使用facebook注册时,我希望有可能在注册之前选择一个用户名(而不是facebook id作为用户名)...我做的是我发送POST参数到facebook登录路线但是我找不到正在处理注册的控制器。

最佳做法是什么?我应该在哪里检索用户名(POST参数)并设置它?

这是我在security.yml中的配置:

firewalls:

public:
  pattern: ^/

  fos_facebook:
    app_url: "http://www.appName.com"
    server_url: "http://local.appName.com/app_dev.php/"
    login_path: /login
    check_path: /login_check/facebook
    provider: appName.facebook.provider

  form_login:
    login_path: /login
    check_path: /login_check/form
    provider: fos_userbundle
    csrf_provider: form.csrf_provider  

这是我用facebook注册的路由:

_security_check_facebook:
    pattern: /login_check/facebook

3 个答案:

答案 0 :(得分:2)

没有控制器处理身份验证,任何身份验证方法都会添加一个将在check_path上触发的侦听器,并执行该操作。

身份验证过程不应负责添加自定义用户数据。如果您遵循FOSFacebookBundle文档,您应该有一个将用户存储在数据库中的自定义用户提供程序,这可能会有点混淆,但这不是注册步骤,是身份验证步骤。添加用户名与配置文件编辑非常相似。

为了帮助你,我应该看看你的实现(你如何发送post参数?)但你可以尝试这样的事情:

  1. 将post参数发送到自定义控制器(由您实施)
  2. 临时商店用户名(也许是用户会话数据?)
  3. 触发身份验证过程(这取决于您的实现,但基本上我们在facebook上讨论身份验证然后发布到login_check路径)
  4. 在经过身份验证的用户处添加用户名
  5. 这可行,但我从未做过这样的事情。

答案 1 :(得分:1)

老问题,但我正在研究类似的问题。我想在第一次与Facebook关联时注册用户时添加一个角色。

如果你从FOSFacebookBundle文档中跟随these步骤,那么你可以点击Facebook连接用户的“注册”,看看FacebookProvider类。

loadUserByUsername方法中有这一部分:

if (!empty($fbdata)) {
    if (empty($user)) {
        $user = $this->userManager->createUser();
        $user->setEnabled(true);
        $user->setPassword('');
    }

    $user->setFBData($fbdata);
    ...

在if中的setPassword后,我为我的用户添加了角色。

有关选择用户名的原始问题...请注意拨打setFBData

在User实体中,该方法如下所示:

public function setFBData($fbdata)
{
    if (isset($fbdata['id'])) {
        $this->setFacebookId($fbdata['id']);
        $this->addRole('ROLE_FACEBOOK');
    }
    if (isset($fbdata['first_name'])) {
        $this->setFirstname($fbdata['first_name']);
    }
    if (isset($fbdata['last_name'])) {
        $this->setLastname($fbdata['last_name']);
    }
    if (isset($fbdata['email'])) {
        $this->setEmail($fbdata['email']);
    }
}

setFacebookId()看起来像这样:

public function setFacebookId($facebookId)
{
    $this->facebookId = $facebookId;
    $this->setUsername($facebookId);
}

这就是用户名来自的地方。我想这是一个流程,您可以将所选用户名插入并设置,而不是$facebookId

答案 2 :(得分:1)

我为此做了另一种方式。 我使用了GraphAPI。

public function setFacebookId($facebookId)
{
    $this->facebookId = $facebookId;
    $username = json_decode(file_get_contents('http://graph.facebook.com/'.$this->facebookId))->username;
    $this->setUsername($username);
}

它采用了Facebook用户名,这是一个独特的用户名。

相关问题