我正在用Symfony3,Nginx,PHP7构build一个Web应用程序。 对于授权,我创build了一个扩展AbstractGuardAuthenticator的TokenAuthenticator类。 我可以使用令牌进行身份validation并手动注销。
如果我不手动注销会话似乎永远持续下去。 我希望应用程序在浏览器closures时使任何会话无效。 所有用户都应该重新进行身份validation,如果这是一个新的浏览器会话。
会话持续存在,即使当我重新启动nginx,php fpm并从cmd行中清除caching时,我也不会被要求重新进行身份validation。
我的TokenAuthenticator有这个方法 :
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 / /
浏览器closures时,如何删除/销毁会话/ 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`