在 yii2.0.54 中,restful 接口获取当前用户名需通过 yii::$app->user->identity->username,前提是正确配置对应认证方式(如 httpbasicauth、jwt 或 access_token)并确保 user::findidentitybyaccesstoken() 已实现,且控制器继承 yii\rest\activecontroller、禁用 csrf 验证。

在 Yii2.0.54 中,RESTful 接口获取当前用户名,本质是获取已认证用户的标识(identity),不能依赖 session 或传统 Web 登录态,而要基于你实际采用的认证方式——常见有 HttpBasicAuth、JWT(Bearer Token) 或 自定义 access_token。关键不是“怎么取”,而是“谁负责设、在哪能取”。
看认证方式:不同机制,取法完全不同
Yii 的 \Yii::$app->user->identity 是统一入口,但它的值由认证行为(authenticator)填充。没走对认证流程,identity 就是 null。
-
用 HttpBasicAuth(用户名+密码):必须自定义
auth回调函数,在里面手动查用户并校验密码;成功后框架自动设 identity。此时\Yii::$app->user->identity->username可用。 -
用 JWT(如 sizeg/yii2-jwt):需自己实现
User::findIdentityByAccessToken($token),从 token 解出用户 ID 再查库;验证通过后 identity 才有效。注意前端必须传Authorization: Bearer xxx,少空格或拼错就静默失败。 -
用 access_token 字段(数据库存 token):HttpBasicAuth 默认走的就是这条路,但只认
username或access_token字符串,不校验密码。只要你的User::findIdentityByAccessToken()能根据 token 查到用户,\Yii::$app->user->identity->username就可取。
控制器里安全获取用户名的写法
别直接访问 $_SERVER['PHP_AUTH_USER'] 或解析 Authorization 头——那是绕过框架,会丢掉认证上下文和安全校验。
- 先确认用户已认证:
if (!\Yii::$app->user->getIsGuest()) { $username = \Yii::$app->user->identity->username; } - 如果用的是自定义 auth 行为,确保它返回了 User 实例(不是数组或 ID),否则 identity 不会被设。
- 在 REST 控制器中,推荐在
beforeAction()或动作开头加判断,避免后续逻辑对 guest 用户报错。
常见踩坑点
很多开发者取不到用户名,其实卡在前置环节:
- 没禁用 CSRF:REST 接口必须设
'enableCsrfValidation' => false,否则未携带 token 的请求直接被拦截,根本进不了认证流程。 - User 类没实现
findIdentityByAccessToken():HttpBasicAuth 和 JWT 都强依赖这个方法,缺了就报 “Call to undefined method”。 - 用了
yii\web\Controller而非yii\rest\ActiveController:前者默认启用视图渲染和 session,会干扰无状态认证流程。 - URL 规则没配对:比如
'controller' => 'user'却访问/api/users(复数),而没设'pluralize' => true,导致路由失败,认证根本不触发。
简单示例:HttpBasicAuth + 手动验密后取名
在控制器 behaviors() 中:
'authenticator' => [
'class' => \yii\filters\auth\HttpBasicAuth::class,
'auth' => function ($username, $password) {
$user = \app\models\User::find()->where(['username' => $username])->one();
return $user !== null && $user->validatePassword($password) ? $user : null;
}
]
之后任意动作里:$username = \Yii::$app->user->identity->username; 就能安全使用。











