我是PHP新手。我已经尝试实现记住我的功能,如下所述。
MysqlSessionHanlder.php->这实现了接口所需的6个会话相关功能+"常规登录"和使用记住我功能登录的所有功能。
login.php->自我解释。
restricted1.php->如果登录成功,login.php将重定向到此页面。
authenticate.php->访问前需要进行身份验证的每个页面都应该包含此页面。
db_connect.php->自我解释。
定期登录效果良好。我也可以在选中记住我复选框的情况下登录,即在这两种情况下,我都会被重定向到restricted1.php。但是,一旦我使用记住我功能登录->关闭浏览器->尝试直接转到restricted1.php,我就会再次被重定向到登录页面。
这是因为restricted1.php调用firstauthenticate.php,并且该文件检查用户是通过常规身份验证还是通过自动登录现有cookie进行身份验证。
如果不是,则意味着用户尝试在没有调用checkCredentials()函数的第一次登录的情况下访问受限页面。
authenticate.php代码
require_once __DIR__ . '/db_connect.php';
require_once __DIR__ . '/../../classes/MysqlSessionHandler.php';
$handler = new MysqlSessionHandler($db);
session_set_save_handler($handler);
session_start();
$_SESSION['active'] = time();
if (isset($_SESSION['authenticated']) || isset($_SESSION['auto_login'])) {
// we're OK
} else {
$autologin = new MysqlSessionHandler($db);
$autologin->checkCredentials();
if (!isset($_SESSION['auto_login'])) {
header('Location: login.php');
exit;
}
}
然而,当我关闭Chrome,重新打开它,然后尝试直接访问restricted1.php时,我会被重定向到login.php。
在调试过程中,我发现了以下内容:
-
每次用户使用记住我功能登录时,我编写的一个名为persistentlogin()的函数都会在DB+中存储一个新的令牌,并使用setCookie()函数设置一个名"auto_login"的cookie,其中包括该令牌。
-
我注意到$_cookie超级全局数组中显示的cookie名称是PHPSSID(默认名称),尽管我在代码中设置了不同的cookie名称("auto_login")。我可以在chrome浏览器设置中看到两个cookie:PHPSSID和"auto_login"cookie,但$_cookie超级全局数组中没有显示"auto_logon"cookie名称。我认为这是我的问题,因为checkCredentials()试图访问"auto_login_cookie",如下所示:
if(isset($_COOKIE[$this->COOKIE]){
$cookie是设置为"auto_login"的属性。
为什么我看不到由$_cookie数组中的setCookie()命令设置的"auto_login"cookie
谢谢,
Qwerty
经过几天的调试(!),我发现了问题:
为什么我的cookie没有设置?
事实证明,我将cookie路径设置为"/"以外的其他路径,这导致了此问题。
无论如何都要感谢:-)
+1献给所有付出辛勤工作,永不放弃,直到达到目的的人!