Symfony3 在登录时立即失去用户会话
Symfony3 loses user session instantly on login
我将我的 Symfony3 应用程序从共享主机移至我刚刚设置的新 VPS。当我尝试登录应用程序时(使用随意的 FOSUserBundle 表单),Symfony 确实让我登录,只是在下一页重新加载时断开了我的连接。 "instantly" 因为成功登录的第一件事就是重定向到一个页面。
我尝试了什么:
- 我禁用了重定向,这让我可以在 'login_check' 页面上看到我已连接。我知道这是因为 Symfony 调试工具栏显示了我的名字。只是在重定向后不再。
- 我可以随时随地看到我的 cookie 中没有 PHPSESSID。我认为是负责让我的 Symfony 会话保持活动状态的 cookie。所以...
- 我尝试了不同的 php 脚本来检查我的 VPS 配置。它确实可以很好地处理 cookie 和 PHP 会话。
- 我什至在子文件夹中安装了 Wordpress,它可以完美地处理我的会话和 cookie。
- Symfony 用于存储会话的服务器文件夹与 Wordpress 使用的相同。会话文件确实出现在 Symfony 登录尝试中。 (虽然有时它们只是空文件...!?)
- 正在将 FOSUB 和 Symfony 升级到最新版本。没有变化。
我正在使用 Symfony 3.4.6 和 FOSUB 2.0.0。有什么想法吗?
更新:Security.yml
# https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
check_path: fos_user_security_check
failure_path: fos_user_security_login
login_path: /fr/public/login
default_target_path: app_homepage
logout:
path: fos_user_security_logout
target: fos_user_security_login
anonymous: true
access_control:
# Allow anonymous logging for these page:
- { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/fr/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/fr/public/*, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/fr/lab, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/fr/help, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/cron, role: IS_AUTHENTICATED_ANONYMOUSLY }
# Techs pages
- { path: ^/_console, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/_wdt, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/_profiler, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/_error, role: IS_AUTHENTICATED_ANONYMOUSLY }
# Staff only
- { path: ^/fr/staff/, role: ROLE_STAFF }
- { path: ^/fr/staff/*, role: ROLE_STAFF }
# Admin only
- { path: ^/fr/admin/, role: ROLE_ADMIN }
- { path: ^/fr/admin/*, role: ROLE_ADMIN }
# All other pages need to be logged
- { path: ^/*, role: [IS_AUTHENTICATED_FULLY,IS_AUTHENTICATED_REMEMBERED] }
您是否尝试过改变:
- { path: ^/fr/public/*, role: IS_AUTHENTICATED_ANONYMOUSLY }
至
- { path: ^/fr/public, role: IS_AUTHENTICATED_ANONYMOUSLY }
因此,问题存在于 cookie 和 SSL 中。在我的新服务器上安装我的应用程序时,传输我的 SSL 证书需要一些时间,所以我网站的 URL 是 HTTP 而不是 HTTPS。
不过,浏览器一直在使用一个名为 PHPSESSID 的 Symfony 用户会话 cookie,它是通过 HTTPS 协议添加的。由于未知原因,此过时 cookie 的存在阻止了日志记录,并且没有返回任何错误。
此外,我使用的是 Firefox 的 EditThisCookie 插件,它没有显示 PHPSESSID cookie 的存在。虽然浏览器还是考虑了。
因此,对于遇到相同(非常具体)问题的任何人:查找并删除可能很难找到的 PHPSESSID cookie,因为不完全在同一协议下。在 Firefox 中:Web 调试器 > 存储 > Cookies。
我遇到了类似的问题,但结果是 session.cookie_secure = true (php.ini) 并且测试站点是 HTTP(不是 HTTPS)
; http://php.net/session.cookie-secure
session.cookie_secure = 假
我将我的 Symfony3 应用程序从共享主机移至我刚刚设置的新 VPS。当我尝试登录应用程序时(使用随意的 FOSUserBundle 表单),Symfony 确实让我登录,只是在下一页重新加载时断开了我的连接。 "instantly" 因为成功登录的第一件事就是重定向到一个页面。
我尝试了什么:
- 我禁用了重定向,这让我可以在 'login_check' 页面上看到我已连接。我知道这是因为 Symfony 调试工具栏显示了我的名字。只是在重定向后不再。
- 我可以随时随地看到我的 cookie 中没有 PHPSESSID。我认为是负责让我的 Symfony 会话保持活动状态的 cookie。所以...
- 我尝试了不同的 php 脚本来检查我的 VPS 配置。它确实可以很好地处理 cookie 和 PHP 会话。
- 我什至在子文件夹中安装了 Wordpress,它可以完美地处理我的会话和 cookie。
- Symfony 用于存储会话的服务器文件夹与 Wordpress 使用的相同。会话文件确实出现在 Symfony 登录尝试中。 (虽然有时它们只是空文件...!?)
- 正在将 FOSUB 和 Symfony 升级到最新版本。没有变化。
我正在使用 Symfony 3.4.6 和 FOSUB 2.0.0。有什么想法吗?
更新:Security.yml
# https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
check_path: fos_user_security_check
failure_path: fos_user_security_login
login_path: /fr/public/login
default_target_path: app_homepage
logout:
path: fos_user_security_logout
target: fos_user_security_login
anonymous: true
access_control:
# Allow anonymous logging for these page:
- { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/fr/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/fr/public/*, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/fr/lab, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/fr/help, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/cron, role: IS_AUTHENTICATED_ANONYMOUSLY }
# Techs pages
- { path: ^/_console, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/_wdt, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/_profiler, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/_error, role: IS_AUTHENTICATED_ANONYMOUSLY }
# Staff only
- { path: ^/fr/staff/, role: ROLE_STAFF }
- { path: ^/fr/staff/*, role: ROLE_STAFF }
# Admin only
- { path: ^/fr/admin/, role: ROLE_ADMIN }
- { path: ^/fr/admin/*, role: ROLE_ADMIN }
# All other pages need to be logged
- { path: ^/*, role: [IS_AUTHENTICATED_FULLY,IS_AUTHENTICATED_REMEMBERED] }
您是否尝试过改变:
- { path: ^/fr/public/*, role: IS_AUTHENTICATED_ANONYMOUSLY }
至
- { path: ^/fr/public, role: IS_AUTHENTICATED_ANONYMOUSLY }
因此,问题存在于 cookie 和 SSL 中。在我的新服务器上安装我的应用程序时,传输我的 SSL 证书需要一些时间,所以我网站的 URL 是 HTTP 而不是 HTTPS。
不过,浏览器一直在使用一个名为 PHPSESSID 的 Symfony 用户会话 cookie,它是通过 HTTPS 协议添加的。由于未知原因,此过时 cookie 的存在阻止了日志记录,并且没有返回任何错误。
此外,我使用的是 Firefox 的 EditThisCookie 插件,它没有显示 PHPSESSID cookie 的存在。虽然浏览器还是考虑了。
因此,对于遇到相同(非常具体)问题的任何人:查找并删除可能很难找到的 PHPSESSID cookie,因为不完全在同一协议下。在 Firefox 中:Web 调试器 > 存储 > Cookies。
我遇到了类似的问题,但结果是 session.cookie_secure = true (php.ini) 并且测试站点是 HTTP(不是 HTTPS)
; http://php.net/session.cookie-secure session.cookie_secure = 假