如果用户在使用我的Symfony2应用程序时在后台登出(由于会话过期或其他原因),我已经在屏幕上显示了一个JS层,允许用户立即重新登录并继续使用该网站.
问题是,如果用户正在填写表单并注销,在使用JS层重新登录后,他仍然使用他已设法输入的值查看相同的表单,但他的会话发生了变化.因此,表单中的CSRF令牌无效.
有没有办法根据当前会话和特定表单生成新的CSRF令牌,通过AJAX抓取并在表单中替换?或者也许有其他解决方案?
我不想禁用CSRF保护.
我目前在我的页面上有表单,无论用户是否登录,都会出现这些表单.用户登录后,会向其显示其中一种表单(使用CSRF).
问题是如果在身份验证后显示此框,则CSRF令牌将失效.我通过允许自己提交没有身份验证检查和$form->isValid()返回的表单来确认这一点,true而在登录后,它给了我false错误:
CSRF令牌无效.请尝试重新提交表单.
我想有三种解决方案 - 停止Symfony在身份验证时重新生成/使CSRF令牌无效,从这些表单中删除CSRF令牌或在身份验证后生成我的表单(但我宁愿避免这种情况).我目前的解决方案是使用身份验证和设置表单标记input值传回新的CSRF令牌.
附加:有谁知道如何查看当前分配的所有CSRF令牌?会议似乎没有举行.
我在数据库中
OneToMany的Server实体和Client实体之间有关联.一台服务器可以有很多客户端.我想创建一个表单,用户可以从下拉列表中选择服务器,填写新客户端的一些详细信息,然后提交.
要创建用户可以将数据输入到字段中的表单,请从下拉列表中Client选择a Server,然后单击"提交"并通过Doctrine 保留此数据(和关联).
简单吧?一定不行.我们会做到这一点.这是现在的漂亮形式:

注意事项:
Server实体(EntityRepository::findAll())填充的在我的无限智慧中,我宣称我的Client实体具有以下构造函数签名:
class Client
{
/** -- SNIP -- **/
public function __construct($type, $port, $endPoint, $authPassword, $authUsername);
/** -- SNIP -- **/
}
Run Code Online (Sandbox Code Playgroud)
这不会改变.要创建有效Client对象,请存在上述构造函数参数.它们不是可选的,如果没有在对象实例化时给出上述参数,则无法创建此对象.
潜在问题:
该type属性是不可变的.创建客户端后,无法更改类型.
我没有一个二传手type.它只是一个构造函数参数.这是因为一旦创建了客户端,就无法更改类型.因此,我在实体层面强制执行此操作.结果,没有setType()或changeType()方法.
我没有标准的setObject命名约定.我声明要更改端口,例如,方法名称changePort()不是setPort().这是我在使用ORM之前需要我的对象API运行的方式.