在阅读了有关 StackOverflow 的问题后,我受到启发,通过编写 Charles Miller 的“持久登录 Cookie 最佳实践”的 PHP/MySQL 实现来帮助他。对于本教程,我将假设您已经拥有一个带有用户登录的 PHP 系统.
CREATE TABLE user_sessions (
user_id INT(11) UNSIGNED NOT NULL,
session VARCHAR(39) NOT NULL,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
PRIMARY KEY (user_id, session)
);
首先,我们需要在您登录时更新站点以将会话存储到 cookie 中。此代码将与您当前的登录系统一起使用。
if (/* Code that verifies credentials */) {
// ... code to log user into session
PersistentAuth::login($userId);
}
其次,我们要检查站点的新用户是否具有 cookie 凭据。此代码将位于代码的开头。它首先检查我们是否已经在 $_SESSION 中登录?如果没有,请尝试基于 cookie 的登录。
if (/* !loggedIn() */ && ($userId = PersistentAuth::cookieLogin())) {
// ... use $userId to log user into session
}
第三,根据 Charles Miller 的文章,如果用户通过 cookie 登录,我们将不允许用户访问以下部分:
- 更改用户密码
- 更改用户的电子邮件地址(尤其是在使用基于电子邮件的密码恢复时)
- 对用户地址、付款详情或财务信息的任何访问
- 任何购买能力
代码:
if (PersistentAuth::isCookieLogin()) {
// User is logged in via cookie and don't have access to this
// section. We need to ask them for the password. Maybe send
// them to some login page?
// TODO ask for password or send to a password page
}
要获取 PersistentAuth 类的所有代码,请在此处查看我的网站:http: //www.chrislondon.co/php-persistent-login/
使用这个 PersistentAuth 类,您必须进行一些更改。您必须更改 getDb() 函数以返回数据库实例。我在这个例子中使用了 PDO。我已经为每次页面刷新设置了清除旧会话的数据库。处理此问题的最佳方法是使用 cron。如果您确实设置了 cron,则在类设置中将 USE_CRON 标志更改为 true