在 Yii2 前后端分离项目中,应通过 Yii::$app->user->identity?->username 安全获取已登录用户名,严格校验认证状态,禁止信任客户端传参或未判空访问 identity,并在 EVENT_AFTER_LOGIN 事件中监听获取以确保上下文一致。

在 Yii2.0.45(及相近版本)用于前后端分离项目时,获取已登录用户名不能依赖视图渲染或 session 自动注入,而需通过 API 响应明确返回,且必须确保认证状态可靠、数据来源安全。核心原则是:不信任客户端传来的任何用户标识,只从已认证的 Identity 实例中提取。
API 接口里安全获取用户名
在控制器动作中(如 actionProfile 或 actionUserInfo),直接读取当前认证用户的用户名:
- 使用
Yii::$app->user->identity?->username,注意空合并操作符?->防止游客访问时报错 - 不要写
Yii::$app->user->identity->username(未判空,游客访问会 PHP Fatal Error) - 若需同时返回 ID、昵称、邮箱等,建议统一从
$user = Yii::$app->user->identity获取后组装数组 - 示例响应:
if (Yii::$app->user->isGuest) { return ['code' => 401, 'message' => '未登录']; } $user = Yii::$app->user->identity; return [ 'code' => 0, 'data' => [ 'id' => $user->id, 'username' => $user->username, 'nickname' => $user->nickname ?? '', ] ];
登录成功后立即获取(事件监听方式)
适用于需要记录日志、初始化用户上下文、同步第三方服务等场景。在 config/web.php 的 bootstrap 阶段或 on beforeRequest 中注册监听器:
- 监听
\yii\web\User::EVENT_AFTER_LOGIN,这是最稳妥的时机 - 从
$event->identity->username取值,而非Yii::$app->user->identity—— 避免上下文不一致 - 确保
user组件的identityClass已正确配置(如'identityClass' => 'app\models\User') - 该事件仅在登录成功且会话写入完成后触发,
$event->identity必然可用
前后端分离下的认证注意事项
Yii2 默认基于 Cookie 的认证机制,在纯 API 场景下需额外适配:
- 前端需在每次请求头带上
X-CSRF-Token(若开启 CSRF 验证)和会话 Cookie(PHPSESSID) - 若用 Token 认证(如 Bearer Token),需重写
User::findIdentityByAccessToken(),并确保登录接口返回有效 token - 避免把用户名拼进 URL 或 GET 参数返回,防止日志泄露;敏感字段如手机号、邮箱应脱敏处理后再返回
- 跨域请求时,后端需配置
'Access-Control-Allow-Credentials' => 'true',前端fetch要加credentials: 'include'
常见错误与规避
以下做法在前后端分离中容易出问题,应避免:
- 在模型或组件中静态调用
Yii::$app->user->identity->username—— 某些命令行或异步任务中$app->user未初始化 - 从
$_POST['username']或请求头中“猜测”当前用户 —— 完全不可信,可能被伪造 - 在
EVENT_BEFORE_LOGIN中尝试取$event->identity->username—— 此时对象尚未创建,会报错 - 重复查询数据库获取用户,例如
User::findOne(Yii::$app->user->id)——$event->identity或Yii::$app->user->identity已是 AR 实例,直接用即可


















