ThinkPHP 5 不推荐用内置缓存存储用户登录信息,因其缺乏用户隔离、自动过期、加密保护及会话语义;应使用 Session 管理登录态,必要时仅对衍生操作(如用户详情、限频、单点登录)结合缓存优化。

ThinkPHP 5 不推荐也不支持用内置缓存(如 Cache 类或 cache() 助手函数)直接存储用户登录信息。这不是功能限制,而是安全与设计原则问题。
为什么不能用 Cache 存登录态?
缓存系统在 TP5 中定位是「临时、共享、无状态」的数据暂存机制,不具备会话隔离、自动过期绑定、防篡改、加密等关键能力:
-
无用户隔离:Cache 键名全局可见,若用
cache('user_id', $uid),所有请求都可能读写同一键,无法区分不同用户 - 无自动销毁机制:用户登出或密码修改后,缓存不会自动失效,需手动清理,极易残留敏感数据
- 无加密保护:File/Redis 缓存默认明文存储,登录凭证类数据裸露风险高
-
非会话语义:TP5 的
session组件才是为登录态设计的——基于唯一 session_id、服务端存储、客户端 Cookie 绑定、支持有效期和销毁钩子
正确做法:用 Session 管理登录态
TP5 内置 think\Session 已完全满足登录信息存储需求,且默认启用:
- 用户登录成功后写入:
session('user_id', $uid); session('username', $name); - 中间件或控制器中验证:
if (!session('?user_id')) { $this->error('请先登录'); } - 登出时清除:
session(null);或session('user_id', null); - 配置可选增强:
config/session.php中设置'expire' => 7200(2小时)、'httponly' => true、'secure' => true(HTTPS 环境)
如果真要结合缓存做“登录相关优化”
可在 Session 基础上,用 Cache 加速某些衍生操作,但绝不替代 Session:
立即学习“PHP免费学习笔记(深入)”;
-
查用户详情时缓存 DB 结果:登录后首次查用户资料,存到带前缀的缓存键里,如
Cache::tag('user')->set('info_'.$uid, $data, 3600) -
限制登录失败频次:用 Redis 记录 IP 或账号的错误次数,
Cache::store('redis')->inc('login_fail_'.$ip),配合 expire 控制窗口期 -
单点登录踢人:登录时生成唯一 token 存入 Redis(键为
login_token_{$uid}),每次请求校验并刷新过期时间;登出时删该键
绝对要避开的写法
以下代码看似能用,但存在严重隐患,切勿使用:
-
cache('login_user_'.$uid, ['id'=>$uid, 'token'=>$token], 3600);—— 缓存不绑定 session_id,跨用户可伪造访问 -
Cache::set('current_user', $user, 0);—— 永久缓存 + 全局键,服务器重启前永不清理,权限失控 - 用
cache()助手函数替代session()进行登录判断 —— 无 Cookie 校验、无法跨请求保持、无法主动销毁



















