Symfony - 重定向后身份验证丢失

时间:2014-07-30 11:14:30

标签: symfony session authentication token provider

我的Symfony项目遇到了问题。

我有两个可以通过Web服务相互通信的Symfony应用程序(我们称之为A和B)。在其中一个(应用程序A)中,我存储了我的用户列表,我正在尝试通过应用程序B对用户进行身份验证。 预期的行为是: - 用户输入他的用户名和密码 - 应用B获取用户名/密码 - 应用B通过WS调用App A,询问该用户是否正常 - 如果用户确定,则App B会创建会话令牌并对用户进行身份验证。

目前,我可以对我的用户进行身份验证,但每次浏览应用B时,都会丢失会话令牌(因此我会重定向到我的/登录页面)。 奇怪的是我仍然经过身份验证,但会话令牌不再包含我的User对象(它包含一个User对象,每个属性都为“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:

我的LoginController(应用B):     public function checkAction(Request $ request)     {
        //Récupérationdulogin et du mot de passe danslesparamètresdelarequête         if($ request-> getMethod()==“POST”)         {             $ username = $ request-> get(“username”);             $ password = $ request-> get(“password”);

        // 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()何时以及如何被召唤。此时,仅在我的用户验证其登录表单时才会调用它。每次我尝试导航到新页面时是否应该调用它?我真的不明白它是如何工作的,我想更好地理解它......

我忘记了什么吗?

感谢。

2 个答案:

答案 0 :(得分:0)

您必须为form_login设置提供程序密钥,即:

form_login:
    ...
    provider: webservice

答案 1 :(得分:0)

我已经能够使用此链接解决我的问题:

http://blog.vandenbrand.org/2012/06/19/symfony2-authentication-provider-authenticate-against-webservice/

很好地解释,我理解得很好,我现在能够通过我的WS验证用户:)