yii2提供五种用户认证方法:一、数据库模型认证,通过activerecord与identityinterface实现;二、静态数组认证,适用于测试场景;三、http basic认证,用于restful api;四、query parameter token认证,适合第三方集成;五、bearer token认证,兼容oauth2标准。

如果您在 Yii2 应用中需要验证用户身份以保障系统安全,则需通过框架内置的认证机制与 IdentityInterface 实现协同工作。以下是实现用户身份认证的多种方法:
一、基于数据库的用户模型认证
该方法适用于拥有持久化用户数据(如 users 表)的典型 Web 应用,通过 ActiveRecord 模型与数据库交互完成登录凭证校验和会话管理。
1、确保数据库中存在 users 表,包含 id、username、password_hash、auth_key、access_token 等字段。
2、使用 Gii 生成 User 模型:执行命令 php yii gii model --tableName=users,并确认生成的类继承自 yii\db\ActiveRecord。
3、在 User 类中实现 IdentityInterface 接口,重写 findIdentity()、findIdentityByAccessToken()、validatePassword()、getAuthKey()、validateAuthKey() 等必需方法。
4、在 config/web.php 的 components 配置中启用 user 组件,并指定 identityClass 为 app\models\User:
'user' => ['class' => 'yii\web\User', 'identityClass' => 'app\models\User', 'enableAutoLogin' => true]
二、无数据库的静态用户认证
该方法适用于开发测试、内部工具或极简后台场景,用户凭据直接硬编码在 PHP 数组中,不依赖数据库查询,降低部署复杂度。
1、在 app/models/User.php 中定义静态 $users 数组,每个元素包含 id、username、password(建议为密码哈希值)、authKey 和 accessToken 字段。
2、重写 findIdentity() 方法,遍历 $users 数组匹配 id;重写 findByUsername() 方法,按 username 查找并返回匹配项。
3、validatePassword() 方法中使用 Yii::$app->security->validatePassword($password, $this->password_hash) 进行比对(若存储的是哈希值);若为明文则直接 strcmp 比较。
4、确保 getAuthKey() 返回数组中对应用户的 authKey 值,validateAuthKey() 则比对传入参数与该值是否一致。
三、HTTP Basic 认证(服务端接口专用)
该方法适用于 RESTful API 场景,客户端在 Authorization 请求头中携带 Base64 编码的 username:password,由服务端即时解码并校验,不依赖 session 或 cookie。
1、在控制器的 behaviors() 方法中配置 CompositeAuth 或单独使用 HttpBasicAuth:
'authenticator' => ['class' => \yii\filters\auth\HttpBasicAuth::className(), 'auth' => [$this, 'auth'] ]
2、在控制器中定义 auth() 回调函数,接收 $username 和 $password 参数,调用 User::findByUsername($username) 并验证密码。
3、若验证失败,抛出 yii\web\UnauthorizedHttpException 异常,返回 401 状态码。
4、注意:仅应在 HTTPS 环境下启用该方式,防止凭据被中间人截获。
四、Query Parameter Token 认证
该方法适用于第三方系统集成或简易 API 调用,将 access-token 作为 URL 查询参数传递(如 ?access-token=abc123),适合无 Cookie 支持或跨域调试场景。
1、在控制器 behaviors() 中启用 QueryParamAuth:
'authenticator' => ['class' => \yii\filters\auth\QueryParamAuth::className(), 'tokenParam' => 'access-token']
2、确保 User 类已实现 findIdentityByAccessToken($token) 方法,从数据库或缓存中查找匹配的用户记录。
3、调用 $user->loginByAccessToken($token, get_class($authMethod)) 完成身份绑定,返回 Identity 实例。
4、注意:access-token 必须具备唯一性、时效性与防爆破能力,建议配合 Redis 存储并设置 TTL。
五、Bearer Token 认证(标准 OAuth2 兼容)
该方法符合 RFC 6750 规范,客户端在 Authorization 请求头中携带 Bearer 后缀的 JWT 或随机 token,适用于前后端分离架构及移动端接入。
1、在控制器 behaviors() 中配置 HttpBearerAuth:
'authenticator' => \yii\filters\auth\HttpBearerAuth::className()
2、User 类中 findIdentityByAccessToken() 方法需支持解析 Bearer token 并校验其签名、过期时间与作用域(scope)。
3、推荐使用 yii2-jwt 扩展生成和验证 JWT,将用户 ID、角色、签发时间等信息嵌入 payload。
4、token 验证失败时,HttpBearerAuth 自动触发 handleFailure(),返回 401 响应且不执行后续动作。










