核心问题是会话未建立或中断导致identity为null,需依次排查session存储、cookie配置、user::findidentity逻辑及autologin设置。

Yii2.0.51 会话失效导致 Yii::$app->user->identity->username 拿不到值,核心问题不在版本号,而在于登录态根本没建立或已中断。isGuest === true 是表象,背后通常是 session 未正确保存、无法读取,或用户身份类未按预期返回实例。
一、先确认是不是真“没登录”,而不是“拿不到 username”
if (Yii::$app->user->isGuest) {
// 用户确实未登录 —— 不是 username 字段为空,而是整个 identity 为 null
var_dump(Yii::$app->user->identity); // 输出 null
} else {
var_dump(Yii::$app->user->identity->username); // 正常应输出用户名
}
isGuest 为 true 时,identity 必然为 null,此时谈 username 没意义。重点应排查:为什么 identity 是 null?
二、常见原因与对应检查点
-
Session 数据未写入或无法读取
- 集群环境用了默认
FileSession→ 各服务器 session 文件不共享 → 请求跳转后找不到 session - 解决:改用
yii\redis\Session或数据库 session,并确保'keyPrefix'、'redis'组件名、连接参数三者全配对 - 验证:登录后
var_dump(Yii::$app->session->getId()),再换接口请求,看 ID 是否一致;若变化,说明 session 未延续
- 集群环境用了默认
-
Cookie 未正确发送或被拦截
-
cookieParams['domain']缺少前导点(如写成'example.com'而非'.example.com')→ 子域名间无法共享 -
cookieParams['httpOnly']为true不影响 PHP 读取,但若前端 JS 修改了 cookie 值(如手动 document.cookie=...),会导致签名失效 -
request->cookieValidationKey未统一配置 → 多实例/子域名下 cookie 解密失败,identity直接为 null
-
-
User 类的
findIdentity()返回 null- 数据库用户记录被删、禁用(
status != 1)、auth_key不匹配、或access_token过期 -
findIdentity()中抛异常(如 DB 连接失败)也会静默导致identity = null - 建议在
findIdentity()开头加日志:Yii::info("findIdentity called for $id", 'user'),确认是否执行、是否查到数据
- 数据库用户记录被删、禁用(
-
自动登录(autoLogin)被禁用或失效
- 若登录时没传
true给$user->login($identity, 3600),或enableAutoLogin => false(在user组件中),则 cookie 不生成,下次请求无凭据可验 - 检查
config/web.php中 user 组件:'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, // 必须为 true 才写 cookie 'loginUrl' => ['site/login'], 'identityCookie' => [ 'name' => '_identity', 'httpOnly' => true, 'domain' => '.example.com', // 注意点号 ], ],
- 若登录时没传
三、快速定位步骤(按顺序执行)
- 查浏览器开发者工具 → Application → Cookies,确认
_identity和PHPSESSID是否存在、Domain 是否匹配、Expire 是否合理 - 登录后立刻访问
/site/test-session(自己写个 action):public function actionTestSession() { Yii::$app->session->set('test', 'ok'); return Yii::$app->session->get('test'); }若返回空,说明 session 层已故障,无需再查 user 组件
- 在
User::findIdentity()中临时加throw new \Exception('findIdentity hit');,看是否触发 —— 不触发说明连这个方法都没走到,问题出在 cookie 解析或 authKey 验证环节 - 检查
phpinfo()中session.save_handler和session.save_path,确认不是files且路径可写(尤其 Docker 或权限受限环境)
不复杂但容易忽略。











