我想与共享相同顶级域名的Symfony网站共享一个身份验证方法。 我使用对所有子域有效的cookie和sfPDOSessionStorage来保存会话数据。
在两个项目中,factories.yml都是这样设置的:
all:
storage:
class: sfPDOSessionStorage
param:
database: doctrine
db_table: sessions
session_name: myauth
db_id_col: id
db_data_col: sess_data
db_time_col: time
session_cookie_domain: ".mydomain.net"
session_cookie_lifetime: 86400
session_cookie_path: /
在我的开发机器和我的同事的机器上,这种机制工作正常,但在服务器上却没有(当我切换子域时,我被要求提供凭据)。我在两种环境之间看到的唯一区别是存储数据的格式,数据似乎在prod服务器上加密,但在我的机器上以明文形式显示。这里没有敏感数据,所以我可以发布一个例子:
开发环境sess_data:
symfony/user/sfUser/lastRequest|i:1295349567;symfony/user/sfUser/authenticated|b:0;symfony/user/sfUser/credentials|a:0:{}symfony/user/sfUser/attributes|a:1:{s:30:"symfony/user/sfUser/attributes";a:1:{s:7:"referer";s:0:"";}}symfony/user/sfUser/culture|s:2:"fr";
生产服务器sess_data:
BB7HBTsQg75NNGvb9Z8sexldqbS79YzDgrztQzSFhsUpEk2EeCOtKw8FQbm31vLIRyr3ZP_klwZFXywnkdem27naIWjIVBP_WwpwNRg4IMj1J0fIfxJN_UOw2RbCWh91L5ryCD_7_ynN2UtxfuJwUWnxoGuUvqD8YQxNdczQipmktPVFk1mVfKE1-BsrdHHLIXH_gi44-Bos3f-EshE5skuQpachnY1FkgvvvOuXEj7zxPflgA3xtGoqJxkDijT-uKnQCH4TrimhvkIRGCt0oVuOdsAJzuWW6ijgPCD3X767mSIzm_lQmJoSGxDB7fAgFihB7Ljoq0tsysC62BqTYFB6dTnuZoj3KON8lXlyNJZVyLgTWZ3EYoObtc8jCKYNDonSjEqzTvwg4NJRVoB5ePx61iTqbDd9qFlkryzj9J8.
我还没有弄清楚哪种加密类型用于在数据库中存储信息,我也不确定这是我问题的根源,但这是我能发现的唯一区别,我看不到任何其他解释。 (PHP和MySQL版本完全相同,我的Ubuntu 10.10和Debian Squeeze服务器端)。
答案 0 :(得分:3)
我认为生产服务器上安装了一些负责加密会话数据的模块。
例如,suhosin补丁为PHP添加了这样一个功能:http://www.hardened-php.net/suhosin/configuration.html
它由 php.ini 中的 suhosin.session.encrypt 配置选项激活。