首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
7.1 调用小部件的两种方式
7.1.1 调用widget()方法使用小部件DatePicker
7.1.2 调用begin()和end()方法使用小部件ActiveForm
7.2 项目实现迭代八:使用ActiveForm小部件替换添加文章视图
7.2.1 调用小部件ActiveForm
7.2.2 “文章标题”文本输入框
7.2.3 “文章栏目”下拉列表框
7.2.4 “文章图片”上传文件输入框
7.2.5 “内容”文本输入域
7.3 自定义小部件
7.3.1 继承Widget
7.3.2 自定义小部件的MVC结构
7.4 项目实现迭代九:自定义首页幻灯片小部件
7.5 项目实现迭代十:分页显示列表页
7.5.1 分页组件Pagination
7.5.2 新闻中心列表页实现数据填充
7.5.3 分页的超链接列表小部件LinkPager
8.1 初识资源包类
8.2 Yii2框架资源管理代码分析
8.2.1 视图中注册资源包类
8.2.2 注册资源文件
8.2.3 输出缓冲区的数据
8.3 AssetBundle类的成员属性
8.4 项目实现迭代十一:本书配套项目实现前端资源管理
8.4.1 实现首页前端资源管理
8.4.2 实现新闻中心列表页前端资源管理
9.1 模型中编写验证规则
9.2 控制器中安全赋值
9.3 控制器中触发验证
9.4 视图中提取错误信息
9.5 项目实现迭代十二:完成“添加文章”页面中的模型验证
10.1 AJAX简介
10.2 传统的JavaScript实现AJAX验证
10.2.1 创建AJAX引擎XMLHttpRequest对象
10.2.2 创建HTTP请求
10.2.3 设置响应HTTP请求状态变化的方法
10.2.4 设置获取服务器返回数据的语句
10.2.5 发送HTTP请求
10.3 jQuery实现AJAX验证
10.4 项目实现迭代十三:完成“添加用户”页面的AJAX验证
11.1 用户登录-表单模型
11.2 用户登录-客户端验证
11.2.1 ActiveForm实现客户端验证代码分析
11.2.2 项目实现迭代十四:完成登录页面的客户端验证
11.3 模型中的自定义方法作为rules()验证器
11.4 用于验证用户名和密码的身份类UserIdentity
11.5 项目实现迭代十五:完成用户登录
11.6 保存用户登录状态的yii\web\User类
12.1 访问控制技术综述
12.2 RBAC简介
12.3 RBAC需求分析及功能概述
12.4 项目实现迭代十六:最简方式实现RBAC
12.4.1 数据库设计
12.4.2 用户管理
12.4.3 角色管理
12.4.4 权限管理
12.4.5 用户—角色配置管理
12.4.6 角色—权限配置管理
12.5 项目实现迭代十七:使用yii\rbac\DbManager实现 RBAC
12.5.1 基本概念
12.5.2 用户管理
12.5.3 角色管理
12.5.4 权限管理
12.5.5 权限管理系统验证
12.6 项目实现迭代十八:使用yii2-admin扩展实现RBAC
12.6.1 配置
12.6.2 使用的数据库表
12.6.3 路由列表
12.6.4 角色列表
12.6.5 用户列表
12.6.6 菜单列表
12.6.7 集成AdminLTE后台主题及菜单展示
12.6.8 基于存取控制过滤器(ACF)的用户登录页面
当前位置:
首页>>
技术小册>>
Yii2框架从入门到精通(中)
小册名称:Yii2框架从入门到精通(中)
### 11.4 用于验证用户名和密码的身份类`UserIdentity` 在Web开发中,用户认证是确保系统安全性的关键环节之一。Yii2框架通过其强大的认证机制,为开发者提供了灵活且安全的用户认证解决方案。其中,`UserIdentity`(或更常见的,Yii2中实际使用的是`IdentityInterface`接口的实现类,如`User`模型)扮演着核心角色,它负责验证用户的身份,特别是通过用户名和密码的验证。本章节将深入探讨如何在Yii2中创建和使用一个用于验证用户名和密码的`UserIdentity`类(或更准确地,是一个实现了`IdentityInterface`接口的模型类)。 #### 11.4.1 理解`IdentityInterface` 在Yii2中,`IdentityInterface`是一个接口,它定义了用户身份认证所需的基本方法。任何想要作为用户身份模型使用的类都必须实现这个接口。`IdentityInterface`包含两个主要方法: - `getId()`: 返回用户的唯一标识符(通常是数据库中的主键ID)。 - `findIdentity($id)`: 根据给定的ID查找并返回用户身份实例。如果找不到对应的用户,则返回`null`。 - `findIdentityByAccessToken($token, $type = null)`: 根据访问令牌查找用户身份实例(可选实现,用于API认证等场景)。 对于大多数基于表单的登录系统,我们主要关注的是`findIdentityByUsername`方法的实现,尽管Yii2的`User`组件默认不直接要求此方法,但通常我们会通过扩展`User`模型或创建一个新的类来实现这一功能,以便能够基于用户名和密码进行验证。 #### 11.4.2 创建`UserIdentity`类(或扩展`User`模型) 在Yii2项目中,通常会有一个`User`模型,它可能直接继承自`yii\db\ActiveRecord`,用于表示数据库中的用户表。为了支持基于用户名和密码的认证,我们可以扩展这个`User`模型,或者创建一个新的类(如`UserIdentity`),来实现`IdentityInterface`接口(尽管在实践中,直接扩展`User`模型并添加必要的逻辑更为常见)。 以下是一个简化的`User`模型示例,它实现了基于用户名和密码的验证逻辑: ```php namespace app\models; use Yii; use yii\db\ActiveRecord; use yii\web\IdentityInterface; class User extends ActiveRecord implements IdentityInterface { public static function tableName() { return '{{%user}}'; // 返回数据库中的表名 } /** * @inheritdoc */ public static function findIdentity($id) { return static::findOne(['id' => $id]); } /** * 根据用户名查找身份。 * * @param string $username 用户名 * @return static|null 返回对应的用户身份实例,如果找不到则返回null */ public static function findByUsername($username) { return static::findOne(['username' => $username]); } /** * @inheritdoc */ public function getId() { return $this->getPrimaryKey(); } /** * 验证密码 * * @param string $password 密码 * @return bool 如果密码正确则返回true,否则返回false */ public function validatePassword($password) { return Yii::$app->security->validatePassword($password, $this->password_hash); } // ... 其他属性和方法 } ``` 在这个例子中,`User`模型不仅实现了`IdentityInterface`接口,还添加了一个`validatePassword`方法,用于验证用户输入的密码是否与数据库中存储的哈希密码匹配。这里使用了Yii2的安全组件`Yii::$app->security`来执行密码的哈希验证。 #### 11.4.3 登录流程 当用户尝试登录时,Yii2的登录流程大致如下: 1. **收集用户输入**:通过表单收集用户名和密码。 2. **验证用户身份**:调用`User::findByUsername($username)`根据用户名查找用户。 3. **验证密码**:如果找到了用户,则调用`validatePassword($password)`方法验证密码是否正确。 4. **登录用户**:如果密码验证通过,则使用`Yii::$app->user->login($user)`方法登录用户,其中`$user`是验证通过的用户实例。 #### 11.4.4 安全性考虑 - **密码存储**:永远不要以明文形式存储密码。Yii2提供了`Yii::$app->security->generatePasswordHash()`方法来生成安全的密码哈希,并使用`validatePassword()`方法进行验证。 - **防止SQL注入**:Yii2的`ActiveRecord`和查询构建器自动处理SQL注入的防护,但开发者仍需注意不要在查询中直接拼接用户输入。 - **会话管理**:确保会话管理配置得当,如设置合适的会话过期时间,使用HTTPS等。 - **错误处理**:在登录失败时,不要向用户透露太多信息,如“用户名不存在”或“密码错误”,而应统一返回“登录失败”的消息,以防止枚举攻击。 #### 11.4.5 结论 通过实现`IdentityInterface`接口(或扩展Yii2的`User`模型),我们可以灵活地处理用户认证逻辑,包括基于用户名和密码的验证。Yii2的认证机制不仅强大而且灵活,支持多种认证方式,如基于令牌的认证、OAuth等。在开发过程中,始终要关注安全性,确保用户数据的安全和隐私得到妥善保护。 通过本章节的学习,你应该能够掌握如何在Yii2项目中实现基于用户名和密码的用户认证,并了解相关的安全性考虑。这将为你构建安全、可靠的Web应用打下坚实的基础。
上一篇:
11.3 模型中的自定义方法作为rules()验证器
下一篇:
11.5 项目实现迭代十五:完成用户登录
该分类下的相关小册推荐:
Magento零基础到架构师(目录管理)
Laravel(10.x)从入门到精通(十九)
Yii2框架从入门到精通(上)
Laravel(10.x)从入门到精通(三)
Yii2框架从入门到精通(下)
PHP合辑3-数组函数
PHP底层原理及源码分析
剑指PHP(从入门到进阶)
Laravel(10.x)从入门到精通(十六)
全栈工程师修炼指南
经典设计模式PHP版
Laravel(10.x)从入门到精通(十一)