Symfony将任意数据设置为匿名访问者会话

时间:2016-07-05 14:36:46

标签: session-cookies symfony symfony-2.7

使用Symfony 3.0.7

简单地说:

我无法为匿名用户设置和检索任意数据到会话中。

换句话说..

我通常从会话对象中检索数据,在具有这几行的任何控制器中:

public function dummyAction(Request $request)
{
    # …
    $session = $request->getSession();
    $my_datas = $session->get('my_key');
    # …

直到今天,这需要(和工作)位于防火墙后面的网站配置标准方式,意味着登录 login_check 键以及用户提供者等。

BUT

现在,我需要一个新防火墙来保护新区域: / api /.+
此区域必须是无状态的,但特殊的uniq URI / api / signup 必须允许会话。
所以我创建了以下防火墙

firewalls:
    apisignup:
        pattern: api/signup
        anonymous: ~
    api:
        pattern: /api/
        provider: usr
        stateless: true
        lexik_jwt: ~

我需要的是在访问者点击时将单个标量值(验证码解决方案)保留到会话中

GET http://192.168.0.5/app_dev.php/en/api/signup

然后,在POST到同一个网址时,我需要检索该值。

备注
目前,无论是通过GET还是POST命中此URL,服务器响应始终都包含一个“set-cookie”标头,就好像浏览器只是删除了此命令并且在下次请求时不传递cookie。

我使用以下代码段进行了测试:

### SERVER SIDE
/**
 * @Route( "/signup", name="api_signup")
 * @Method( {"GET","POST"} )
 */
public function signupAction( Request $request )
{
    $session = $this->get('session');
    if ( $request->isMethod('POST') ) {
        $datas = $request->request->all();
        return new JsonResponse([
            'received' => $datas['captcha']
            ,'captcha' => var_export($session->get('captcha'), true)
        ]);
    }
    $session->set('captcha','foobar');
    return new JsonResponse(['challenge' => 'foobar']);
}

### CLIENT SIDE
$.ajax({
    url:'http://192.168.0.100/app_dev.php/en/api/signup'
    ,method: 'get'
    ,success : function(datas){
        // datas.challenge && $('#captcha').html(datas.challenge) &&
        $.ajax({
            url:'http://192.168.0.100/app_dev.php/en/api/signup'
            ,method: 'post'
            ,data: {
                captcha: 'foobar' // prompt("Captcha ?")
                // ...
            }
        });
    }
});

POST JsonResponse“验证码”值始终包含 null

任何想法(“我错过了”|“都可能导致这种行为”)? 谢谢。

1 个答案:

答案 0 :(得分:1)

我敢打赌你是从另一个域发出请求 在这种情况下提醒CORS要求:

  1. 服务器端,Access-control-allow_credentials 标题必须设置为true
  2. 客户端,withCredentials xhr属性必须设置为true
  3. 然后,您的XHTTP请求将使用该请求推送该域的任何可用的set cookie。请务必设置适当的限制政策,以降低CSRF

    的风险