Symfony 将任意数据设置为匿名访问者 session
Symfony set arbitrary data into anonymous visitor session
使用 Symfony 3.0.7
简单地说:
我无法为匿名用户设置和检索任意数据到 session。
换句话说..
我通常从 session object 中检索数据,在任何控制器中使用以下几行:
public function dummyAction(Request $request)
{
# …
$session = $request->getSession();
$my_datas = $session->get('my_key');
# …
直到今天,这在 url 防火墙后面需要(并且有效)以标准方式配置,这意味着 login 和 login_check 密钥以及 用户提供商 等
但是
现在,我需要一个新的防火墙来保护一个新的区域:"/api/.+"。
此区域必须是无状态的,但特殊的 uniq URI "/api/signup" 必须允许 sessions.
所以我创建了以下防火墙
firewalls:
apisignup:
pattern: api/signup
anonymous: ~
api:
pattern: /api/
provider: usr
stateless: true
lexik_jwt: ~
我只需要在访问者点击
时将单个标量值(验证码解决方案)保存到 session
GET http://192.168.0.5/app_dev.php/en/api/signup
然后,在 POST 到相同的 url,我需要检索值。
备注
目前,无论我通过 GET 还是 POST 命中此 url,服务器响应始终包含“set-cookie” header,就好像浏览器只是简单地删除了此命令而不传递 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.
知道什么(“我失踪了”|“可能导致这种行为”)吗?
谢谢。
我打赌你是从另一个域发出请求。
在这种情况下提醒 CORS 要求:
- 服务器端,
Access-control-allow_credentials
header 必须设置为 true
- 客户端,
withCredentials
xhr 属性 必须设置为 true
然后,您的 XHTTP 请求将随请求推送该域的任何可用设置 cookie。确保设置适当的限制策略以降低 CSRF
的风险
使用 Symfony 3.0.7
简单地说:
我无法为匿名用户设置和检索任意数据到 session。
换句话说..
我通常从 session object 中检索数据,在任何控制器中使用以下几行:
public function dummyAction(Request $request)
{
# …
$session = $request->getSession();
$my_datas = $session->get('my_key');
# …
直到今天,这在 url 防火墙后面需要(并且有效)以标准方式配置,这意味着 login 和 login_check 密钥以及 用户提供商 等
但是
现在,我需要一个新的防火墙来保护一个新的区域:"/api/.+"。
此区域必须是无状态的,但特殊的 uniq URI "/api/signup" 必须允许 sessions.
所以我创建了以下防火墙
firewalls:
apisignup:
pattern: api/signup
anonymous: ~
api:
pattern: /api/
provider: usr
stateless: true
lexik_jwt: ~
我只需要在访问者点击
时将单个标量值(验证码解决方案)保存到 sessionGET http://192.168.0.5/app_dev.php/en/api/signup
然后,在 POST 到相同的 url,我需要检索值。
备注
目前,无论我通过 GET 还是 POST 命中此 url,服务器响应始终包含“set-cookie” header,就好像浏览器只是简单地删除了此命令而不传递 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.
知道什么(“我失踪了”|“可能导致这种行为”)吗?
谢谢。
我打赌你是从另一个域发出请求。
在这种情况下提醒 CORS 要求:
- 服务器端,
Access-control-allow_credentials
header 必须设置为 true - 客户端,
withCredentials
xhr 属性 必须设置为 true
然后,您的 XHTTP 请求将随请求推送该域的任何可用设置 cookie。确保设置适当的限制策略以降低 CSRF
的风险