在Symfony2中使用FOSUserBundle的OpenID

时间:2011-10-23 14:26:08

标签: symfony openid fosuserbundle

我正在尝试在此项目的基础上将openID与FOSUserBundle集成: http://symfony2bundles.org/diegogd/fosuser-fpopenid

不幸的是,他们有错误。一个是配置问题(对于想要尝试的人): 应该读取src / SC / UsersBundle / Resources / config / routing / security.xml中的第8行     SCUsersBundle:安全性:登录

这暗示该项目从未完成。在解决之后,我得到“SQLSTATE [23000]:完整性约束违规:1048列'电子邮件'不能为空” 这似乎是因为User对象是序列化的,并且由于某种原因,FOSUserBundle在“serialize”方法中不包含电子邮件。

之后,一些其他属性被包含在重写方法(包括“id”)中,系统仍然想要创建一个新条目而不是更新现有条目。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在FOSUserBundle的InteractiveLoginListener中反序列化用户对象时出现问题。现在,您可以手动设置安全令牌并将用户重定向到另一个页面,而不是将它们发送回fos_user_security_check。

例如,而不是:

// IMPORTANT: It is required to set a user to token (UserInterface)
$newToken = new OpenIdToken($token->getOpenIdentifier(), $user->getRoles());
$newToken->setUser($user);

$tokenPersister->set($newToken);

// IMPORTANT: It is required make a redirect to `login_check` with parameter `openid_approved`
return $this->redirect($this->generateUrl('login_check_route', array('openid_approved' => 1)));

这样做:

// IMPORTANT: It is required to set a user to token (UserInterface)
$newToken = new OpenIdToken($token->getOpenIdentifier(), $user->getRoles());
$newToken->setUser($user);

$tokenPersister->set($newToken);
$this->get('security.context')->setToken($newToken);

return $this->redirect($this->generateUrl('authenticated_user_dashboard'));

“authenticated_user_dashboard”是您希望用户最终使用的内部目标网页。

请注意,由于未调用FOSUserBundle的InteractiveLoginListener :: onSecurityInteractiveLogin(),因此不会自动更新上次登录时间。

这是makasim正在研究的一个已知问题:https://github.com/formapro/FpOpenIdBundle/issues/5

答案 1 :(得分:0)

主分支包含问题的修复