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

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

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

此后,其他属性(包括“id”)包含在覆盖方法中,系统仍然希望创建一个新条目,而不是更新现有条目。

有任何想法吗?

最佳答案

在FOSUserBundle的InteractiveLoginListener中反序列化用户对象存在问题。现在,您可以手动设置安全性 token 并将用户重定向到另一个页面,而不是将其发送回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

关于symfony - Symfony2中带有FOSUserBundle的OpenID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7866691/

10-12 04:43