当用户尝试登录时,我突然在网站上遇到失败会话,导致产生SessionUnavailableException。该文档将此描述为当客户端无法接受会话信息(如正在禁用Cookie或会话过期)时发生的情况。然而,我们正在platform.sh上的这个特定站点上的所有分支机构的多个浏览器中体验到这一点,而我们的本地开发环境完美无瑕。我们已验证用于测试的所有浏览器都启用了Cookie。在生产服务器上登录尝试导致SessionUnavailableException
主持人: Platform.sh
框架: Symfony的3.2/FOS用户捆绑2.0.1
重现步骤:
- 访问登录URL
- 尝试使用授予ROLE_ADMIN的用户登录
结果:
您立即重定向到登录页面,验证(匿名用户)。
预期的结果:
- 你会被登录为正确的用户,并重定向到 行政区域。
这刚刚发生在平台上的这个网站,自上次成功登录尝试以来没有应用任何代码更改。
其他企图
我们initally使用基于会话存储文件。平台支持建议使用Redis或数据库会话存储。
我们首先尝试使用带有PHPRedis的SNC Redis包的Redis会话存储,并且能够在我们的开发环境中成功地将会话存储在Redis以及生产服务器的暂存分支上,但是会抛出相同的异常,用户仍然匿名重定向到登录页面。
我们的第二次尝试是使用Symfony的PDO会话处理程序使用数据库存储,并且我们经历了完全相同的事情。会话信息已成功存储在数据库中,但我们仍然被匿名重定向到登录页面,并引发SessionUnavailableException。
这是来自profiler的图像,显示我们在platform.sh遇到的会话异常。
以下是从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 }
最后,我觉得这是考虑到相同的代码结账主机的问题在其他环境中正常工作。然而,平台的支持是相当缓慢的,所以我想我会把它扔在这里,看看专家是否有任何想法。
感谢您的期待,如果有进一步的信息,我可以提供请不要犹豫,问。
那是一个有趣的想法,谢谢。我通过应用程序服务器上的错误日志挖掘出来,并没有在这些方面发现任何东西,分析器中也没有发现这样的问题。 –