【发布时间】:2011-06-11 03:14:46
【问题描述】:
我想为共享相同顶级域的 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)。
【问题讨论】:
-
看起来会话数据只是简单的 base64 编码。我对其进行了解码,结果是一个实际加密的字符串。可以使用 AES 或其他 2 路加密方法。我不知道为什么两台服务器会有所不同。你有安装任何安全插件吗?
标签: session authentication symfony1 doctrine