对于背景,这是我的方案:
我正在为特定的利基构建一个自托管平台,该平台的一部分是登录过程,如果验证,则为用户设置会话。在每个管理页面加载时,会话启动并检查变量$_SESSION['key']
以查看它是否为真。
如果为false,则会将用户重定向到登录页面,并显示错误,告知他们再次登录。
问题在于这取决于正在设置或未设置的会话cookie,因为会话cookie过期并且会话以session_start()
启动以检查$_SESSION['key']
,因此创建了具有默认值的新会话cookie(我使用session_set_cookie_params()
来改变路径,超时等)使得无法重新登录,因为会话cookie不会从我看到的内容中覆盖。
为了解决这个问题,我在考虑session_set_cookie_params(5, ..)
之前考虑使用session_start()
之类的内容,这会创建一个5秒的会话cookie,因此允许新的在重新登录时创建,但我不确定这是否可行 - 我也确定必须有一种更有效的方法来设置/取消设置会话变量?
这是我的代码:
如果验证登录
,则启动会话$_SESSION['key']
检查$ _SESSION ['key']是否仍为真
if($validated){
session_set_cookie_params(1800, "/inst", $server_name['home']);
session_name("_inst");
session_start();
$_SESSION['key'] = true;
}
任何答案或建议都会很棒,请询问您是否需要澄清任何内容!
答案 0 :(得分:2)
只需在所有页面上发出session_start()。这将无条件地为您创建一个会话,然后您可以检查密钥的存在/消除:
<?php
session_start();
if (!isset($_SESSSION['key'])) { // never logged in, or were logged in and got logged out
... redirect to login ...
exit();
}
if ($_SESSION['key'] != 'expected value') { // logged in, but no longer a valid login.
... redirect to login ...
exit();
}
你根本不应该搞乱会话cookie设置。将它们保留为默认值,只需检查相关的密钥即可。如果他们不在那里,那么用户就没有登录,应该被重定向。
如果他们的会话已经过期并且PHP清理了会话文件,那么他们已经被有效地注销,即使他们有一个非常有效的一点时间会话密钥,并且应该重定向再次登录。