我正在使用Symfony3,Nginx,PHP7构建Web应用程序。为了授权,我创建了一个扩展AbstractGuardAuthenticator的TokenAuthenticator类。我可以使用令牌进行身份验证并手动注销。
如果我不手动注销,会话似乎会永远持续下去。我希望应用程序在浏览器关闭时使任何会话无效。如果是新的浏览器会话,所有用户都应重新进行身份验证。
会话仍然存在,即使我重新启动了nginx,php fpm并从cmd行中清除缓存,也不会要求我重新进行身份验证。
我的令牌身份验证器有这样的方法:
public function supportsRememberMe()
{
return false;
}
config.yml:
session:
handler_id: session.handler.native_file
save_path: "/var/lib/php/sessions/%kernel.environment%"
cookie_lifetime: 0
security.yml:
main:
guard:
authenticators:
- app.token_authenticator
logout:
path: logout
target: /
invalidate_session: true
anonymous: false
PHP.ini:
session.cookie_httponly On On
session.cookie_lifetime 0 0
session.cookie_path / /
当浏览器关闭时,如何删除/销毁会话/cookie(PHPSESSID)?
必须有一个简单的技巧来做到这一点。
编辑:
在这个答案中得到了很好的解释,为什么在开发服务器上会话大多永不过期 https://stackoverflow.com/a/1505596/1249820
通过在 php.ini 中设置 session.gc_probability = 1 来解决此问题,默认值为 0。 用于清除会话的 php cronjob/etc/cron.d/php 每 30 分钟运行一次
09,39 * * * * root [-x /usr/lib/php/sessionclean] && /usr/lib/php/sessionclean
验证 cronjob 是否已执行:
`grep CRON /var/log/syslog | tail`