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 - 重定向后身份验证丢失的主要内容,如果未能解决你的问题,请参考以下文章

只触发一次的 Symfony 身份验证事件?

React Router - 身份验证后重定向延迟

在刷新重定向页面时丢失访问令牌

Symfony2 扩展 DefaultAuthenticationSuccessHandler

在 Glassfish 上进行领域身份验证后重定向

Symfony 安全返回 401 响应而不是重定向