Symfony - 重定向后身份验证丢失
Posted
技术标签:
【中文标题】Symfony - 重定向后身份验证丢失【英文标题】:Symfony - Authentication lost after redirection 【发布时间】:2014-09-22 00:14:16 【问题描述】:我的 Symfony 项目遇到问题。
我有两个 Symfony 应用程序(我们称它们为 A 和 B),它们可以通过 Web 服务相互通信。在其中一个(应用程序 A)中,我存储了我的用户列表,并且我试图通过应用程序 B 对用户进行身份验证。 预期的行为是: - 用户输入他的用户名和密码 - 应用 B 获取用户名/密码 - App B 通过 WS 调用 App A,询问此用户是否正常 - 如果用户 OK,App B 创建会话令牌并验证用户。
目前,我可以对我的用户进行身份验证,但每次浏览应用程序 B 时,我都会丢失会话令牌(因此我被重定向到我的 /login 页面)。 奇怪的是我仍然通过了身份验证,但是会话令牌不再包含我的用户对象(它包含一个每个属性为“null”的用户对象)。
这是我的 security.yml :
providers:
webservice:
id: webservice_user_provider
firewalls:
login:
pattern: ^/login$|^/check$|^/_wdt
anonymous: true
secured:
pattern: ^/
anonymous: false
form_login:
check_path: /login_check
login_path: login
username_parameter: username
password_parameter: password
default_target_path: /
logout:
path: logout
access_control:
我的登录控制器(应用程序 B): 公共函数 checkAction(请求 $request) // Récupération du login et du mot de passe dans les paramètres de la requête if ($request->getMethod() == "POST") $username = $request->get("username"); $password = $request->get("密码");
// Interrogation du repo pour savoir si l'utilisateur existe
$repo = $this->getDoctrine()->getRepository("EntrepotEntitiesBundle:Utilisateurecommercant");
/* @var $repo \Entrepot\EntitiesBundle\Repository\UtilisateurecommercantRepository */
$user = $repo->findByLoginAndPassword($username, $password);
if ($user != null) // On a retrouvé un utilisateur => OK
// On sérialise alors un token de connexion dans la session
$this->login($request, $user);
return $this->indexAction();
return $this->render('EntrepotUtilisateurBundle::index.html.twig', array(
'last_username' => $this->getRequest()->getSession()->get(SecurityContext::LAST_USERNAME),
));
public function login(Request $request, UserInterface $user)
$token = new UsernamePasswordToken($user, $user->getPassword(), 'secured', $user->getRoles());
$request->getSession()->set('_security_secured', serialize($token));
$this->get("security.context")->setToken($token);
// Et on lève un évènement "login"
$event = new InteractiveLoginEvent($request, $token);
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event);
我不明白的一件事是应该何时以及如何调用 checkAction()
。目前,只有当我的用户验证他的登录表单时才会调用它。每次我尝试导航到新页面时都应该调用它吗?我真的不明白它是如何工作的,我想更好地理解它......
我是不是忘记了什么?
谢谢。
【问题讨论】:
checkAction()
的使用方式与您所说的完全一样,即:不应每次都调用它。关于防火墙我遇到了类似的问题,并通过共享防火墙的上下文解决了它。阅读symfony.com/doc/current/book/security.html :常见的陷阱。但是我不知道这如何转化为 WS 身份验证。
【参考方案1】:
您必须为您的 form_login 设置提供程序密钥,即:
form_login:
...
provider: webservice
【讨论】:
【参考方案2】:我已经能够使用此链接解决我的问题:
http://blog.vandenbrand.org/2012/06/19/symfony2-authentication-provider-authenticate-against-webservice/
解释得很好,我理解得很好,现在我可以通过我的 WS 对用户进行身份验证:)
【讨论】:
以上是关于Symfony - 重定向后身份验证丢失的主要内容,如果未能解决你的问题,请参考以下文章