我正在尝试在此项目的基础上将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”)中,系统仍然想要创建一个新条目而不是更新现有条目。
有什么想法吗?
答案 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)
主分支包含问题的修复