2017-09-01 87 views
0

当用户尝试登录时,我突然在网站上遇到失败会话,导致产生SessionUnavailableException。该文档将此描述为当客户端无法接受会话信息(如正在禁用Cookie或会话过期)时发生的情况。然而,我们正在platform.sh上的这个特定站点上的所有分支机构的多个浏览器中体验到这一点,而我们的本地开发环境完美无瑕。我们已验证用于测试的所有浏览器都启用了Cookie。在生产服务器上登录尝试导致SessionUnavailableException

主持人: Platform.sh

框架: Symfony的3.2/FOS用户捆绑2.0.1

重现步骤:

  1. 访问登录URL
  2. 尝试使用授予ROLE_ADMIN的用户登录

结果:

您立即重定向到登录页面,验证(匿名用户)。

预期的结果:

  • 你会被登录为正确的用户,并重定向到 行政区域。

这刚刚发生在平台上的这个网站,自上次成功登录尝试以来没有应用任何代码更改。

其他企图

我们initally使用基于会话存储文件。平台支持建议使用Redis或数据库会话存储。

我们首先尝试使用带有PHPRedis的SNC Redis包的Redis会话存储,并且能够在我们的开发环境中成功地将会话存储在Redis以及生产服务器的暂存分支上,但是会抛出相同的异常,用户仍然匿名重定向到登录页面。

我们的第二次尝试是使用Symfony的PDO会话处理程序使用数据库存储,并且我们经历了完全相同的事情。会话信息已成功存储在数据库中,但我们仍然被匿名重定向到登录页面,并引发SessionUnavailableException。

这是来自profiler的图像,显​​示我们在platform.sh遇到的会话异常。

enter image description here

以下是从config.yml与安全相关的部件。阳明对利用PDO会话存储的最新尝试:

#config.yml 
imports: 
    - { resource: parameters.yml } 
    - { resource: parameters_platform.php } 
    - { resource: security.yml } 
    - { resource: services.yml } 
parameters: 
    locale: en 
framework: 
    translator: { fallbacks: ["%locale%"] } 
    secret: "%secret%" 
    router: 
     resource: "%kernel.root_dir%/config/routing.yml" 
     strict_requirements: ~ 
    form: ~ 
    csrf_protection: ~ 
    validation: { enable_annotations: true } 
    #serializer: { enable_annotations: true } 
    templating: 
     engines: ['twig'] 
    default_locale: "%locale%" 
    trusted_hosts: ~ 
    trusted_proxies: ~ 
    session: 
     handler_id: session.handler.pdo 
    fragments: ~ 
    http_method_override: true 
    assets: ~ 
    cache: 
     app: cache.adapter.redis 
     default_redis_provider: %redis_host% 

# Twig Configuration 
twig: 
    debug:   "%kernel.debug%" 
    strict_variables: "%kernel.debug%" 
    form_themes: 
     - '::fields.html.twig' 

# Doctrine Configuration 
doctrine: 
    dbal: 
     driver: pdo_mysql 
     host:  "%database_host%" 
     port:  "%database_port%" 
     dbname: "%database_name%" 
     user:  "%database_user%" 
     password: "%database_password%" 
     charset: UTF8 
     server_version: '10.0' 
    orm: 
     auto_generate_proxy_classes: "%kernel.debug%" 
     naming_strategy: doctrine.orm.naming_strategy.underscore 
     auto_mapping: trueredis 
     metadata_cache_driver: 
     query_cache_driver: redis 
     result_cache_driver: redis 

# FOS Users 
fos_user: 
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel' 
    firewall_name: main 
    user_class: FlyEvv\UserBundle\Entity\User 
    from_email: 
     address: "%mailer_user%" 
     sender_name: Admin 

# Redis 
snc_redis: 
    clients: 
     default: 
      type: phpredis 
      alias: default 
      dsn: %redis_host% 
     session: 
      type: phpredis 
      alias: session 
      dsn: %redis_host% 
     doctrine: 
      type: phpredis 
      alias: doctrine 
      dsn: %redis_host% 
    session: 
     client: session 
     prefix: foo 
    doctrine: 
     metadata_cache: 
      client: doctrine 
      entity_manager: default   # the name of your entity_manager connection 
      document_manager: default  # the name of your document_manager connection 
     result_cache: 
      client: doctrine 
      entity_manager: [default, read] # you may specify multiple entity_managers 
     query_cache: 
      client: doctrine 
      entity_manager: default 
     second_level_cache: 
      client: doctrine 
      entity_manager: default 

#security.yml 
security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: bcrypt 
    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 
    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username 
    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_token_generator: security.csrf.token_manager 
      logout:  true 
      anonymous: true 

    access_control: 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin/, role: ROLE_ADMIN } 

最后,我觉得这是考虑到相同的代码结账主机的问题在其他环境中正常工作。然而,平台的支持是相当缓慢的,所以我想我会把它扔在这里,看看专家是否有任何想法。

感谢您的期待,如果有进一步的信息,我可以提供请不要犹豫,问。

回答

0

不确定这会有所帮助,但是因为您没有在开发中体验到这一点,而是在生产中遇到这种情况。

我看到这个时,你的头大小太大。所以基本上在生产中,由于启用了分析功能,您的头标大小更大。这反过来又会使您超过应用程序服务器的标题大小限制。

+0

那是一个有趣的想法,谢谢。我通过应用程序服务器上的错误日志挖掘出来,并没有在这些方面发现任何东西,分析器中也没有发现这样的问题。 –

0

我会继续回答这个问题,因为我发现这个问题,并希望它可以帮助别人。

显然我们团队中的另一位开发人员在.platform/routes.yaml中更改了默认路由上的缓存设置。最有可能通过platform.sh控制面板。有一个“Cookie到白名单”的设置(这是因为我未知的原因)设置为“没有Cookies”。将其设置回所有Cookie解决了问题。

相关信息: https://docs.platform.sh/configuration/routes/cache.html#basic-usage

相关问题