Symfony2会话固定如何工作?

csv*_*van 20 security symfony

根据标准2.4文档,security.yml配置文件允许以下配置选项:

session_fixation_strategy: none | migrate | invalidate
Run Code Online (Sandbox Code Playgroud)

来源:http://symfony.com/doc/current/reference/configuration/security.html

但是,我没有在官方文档(或其他地方)中找到有关此选项实际执行的内容或其在实践中如何工作的任何详细信息.

因此,如果我将此选项设置为"migrate"或"invalidate",这将如何影响我的系统中的会话处理?例如,如果我将其设置为"invalidate",这是否意味着当用户导航到不同的安全上下文时,上下文本地会话无效?

Deb*_*rás 19

简而言之:

  • NONE:会话未更改
  • MIGRATE:更新会话ID,保留属性
  • INVALIDATE:会话ID更新,属性丢失

详细地:

  1. 无策略:在默认会话实现中没有(应该)完成任务,因此会话从一个上下文维护到另一个上下文.

  2. 迁移策略:"将当前会话迁移到新的会话ID,同时保留所有会话属性." (会话存储应该重新生成当前会话.)"重新生成代表此存储的id.此方法必须调用session_regenerate_id($ destroy),除非此接口用于为单元或功能测试而设计的存储对象,其中真正的PHP会话会干扰注意,重新生成+销毁不应该清除内存中的会话数据,只能从持久存储中删除会话数据." 因此,会话从一个上下文保留到另一个上下文.

  3. 无效策略:"清除所有会话属性并闪烁并重新生成会话,并从持久性中删除旧会话." 因此,会话从一个上下文重新生成到另一个上下文.

您的问题没有透露您尝试获取的会话数据类型.
但无论如何,不​​会为不同的安全上下文生成单独的会话:http: //symfony.com/doc/current/reference/configuration/security.html#firewall-context

安全(身份验证)相关数据存储在单独的密钥下(基于防火墙名称).因此,例如,如果您的防火墙名称为"main",则身份验证令牌将存储在"_security_main"下,如果您有防火墙(单独的上下文)且名称为"foo",则用户和相关令牌数据将存储在'_security_foo'等下面

因此,除了 - > getToken - > getUser(等)之外,如果您使用'none'或'migrate'会话策略,其余的会话变量将在不同的上下文中可用.

请查看会话界面以获取详细信息(引用来自这些文件)vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/Session/SessionInterface.php

默认实现:vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/Session/Session.php