首页
技术小册
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.5 项目实现迭代十五:完成用户登录 在本章中,我们将深入探讨Yii2框架中用户登录功能的完整实现过程。用户登录是任何Web应用程序中至关重要的一环,它不仅涉及到用户身份的验证,还关联到后续的用户会话管理、权限控制等核心功能。通过本章节的学习,你将能够掌握如何在Yii2项目中构建安全、高效的用户登录系统。 #### 11.5.1 规划用户登录流程 在开始编码之前,首先需要明确用户登录的整体流程: 1. **用户输入凭证**:用户在登录表单中输入用户名(或邮箱)和密码。 2. **表单验证**:前端(JS)和后端(Yii2的模型验证规则)分别对用户输入进行验证,确保数据的合法性。 3. **身份验证**:使用Yii2的认证组件(如`User`组件),通过查询数据库验证用户身份。 4. **会话管理**:验证成功后,创建或更新用户会话,设置身份标识。 5. **登录成功/失败反馈**:根据登录结果,向用户展示相应的成功或失败信息,并跳转到相应的页面。 #### 11.5.2 准备数据库和用户模型 ##### 数据库设计 确保你的数据库中已存在用户表(通常命名为`user`),表中应包含至少以下字段: - `id`(主键,自增) - `username`(用户名,唯一) - `email`(电子邮箱,可选但推荐) - `password_hash`(加密后的密码) - `auth_key`(用于身份验证的密钥) - `status`(用户状态,如0为禁用,1为启用) ##### 用户模型(User.php) 在Yii2中,通常使用`ActiveRecord`来表示数据库中的一行数据。对于用户表,你应创建一个`User`模型,并配置好其对应的表名和验证规则。此外,你还需要重写`findIdentity`、`validateAuthKey`和`generateAuthKey`方法来支持Yii2的身份验证机制。 ```php namespace app\models; 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, 'status' => self::STATUS_ACTIVE]); } /** * {@inheritdoc} */ public static function findIdentityByAccessToken($token, $type = null) { // 根据项目需求实现 throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.'); } /** * 验证密码 * * @param string $password password to validate * @return bool if password provided is valid for current user */ public function validatePassword($password) { return Yii::$app->security->validatePassword($password, $this->password_hash); } // ... 其他认证相关方法 } ``` #### 11.5.3 创建登录表单 在Yii2中,使用表单(Form)组件结合ActiveForm小部件来创建表单是一个常见且高效的做法。在你的登录视图文件中(如`login.php`),你可以这样编写代码: ```php <?php use yii\helpers\Html; use yii\widgets\ActiveForm; /* @var $this yii\web\View */ /* @var $form yii\widgets\ActiveForm */ /* @var $model app\models\LoginForm */ $this->title = '登录'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="site-login"> <h1><?= Html::encode($this->title) ?></h1> <p>请填写以下字段进行登录:</p> <?php $form = ActiveForm::begin([ 'id' => 'login-form', 'options' => ['class' => 'form-horizontal'], 'fieldConfig' => [ 'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>", 'labelOptions' => ['class' => 'col-lg-1 control-label'], ], ]); ?> <?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?> <?= $form->field($model, 'password')->passwordInput() ?> <?= $form->field($model, 'rememberMe')->checkbox() ?> <div class="form-group"> <div class="col-lg-offset-1 col-lg-11"> <?= Html::submitButton('登录', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?> </div> </div> <?php ActiveForm::end(); ?> </div> ``` 注意,这里我们使用了一个`LoginForm`模型来处理登录逻辑,它并非直接映射到数据库的用户表,而是用于收集表单数据、进行前端验证,并最终通过`User`模型进行身份验证。 #### 11.5.4 编写登录逻辑 在`LoginForm`模型中,你需要编写处理登录请求的逻辑。这通常包括收集用户输入、验证输入(前端验证已通过)、通过`User`模型验证用户身份,并根据验证结果设置会话或返回错误信息。 ```php namespace app\models; use Yii; use yii\base\Model; class LoginForm extends Model { public $username; public $password; public $rememberMe = true; private $_user = false; // ... 验证规则 public function login() { if ($this->validate()) { return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0); } else { return false; } } protected function getUser() { if ($this->_user === false) { $this->_user = User::findByUsername($this->username); } return $this->_user; } } ``` 在`User`模型中,你应添加`findByUsername`方法来根据用户名查找用户,并确保其状态为激活。 #### 11.5.5 配置URL路由和控制器 为了让用户能够访问登录页面并提交登录表单,你需要在URL管理器中配置相应的路由,并在控制器中编写处理登录请求的动作(Action)。 - **配置路由**:在`config/web.php`中的`components['urlManager']['rules']`数组中添加路由规则。 - **编写控制器**:在相应的控制器(如`SiteController`)中添加处理登录的逻辑。 ```php // SiteController.php public function actionLogin() { if (!\Yii::$app->user->isGuest) { return $this->goHome(); } $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } else { return $this->render('login', [ 'model' => $model, ]); } } ``` #### 11.5.6 测试与调试 完成上述步骤后,你应该能够运行你的应用并测试登录功能。注意检查以下几个方面: - 表单提交是否正确。 - 用户身份验证是否有效。 - 登录成功后的会话管理是否正常。 - 登录失败时的错误处理是否友好。 如果遇到问题,利用Yii2的调试工具和日志功能来定位和解决问题。 #### 11.5.7 安全最佳实践 在构建用户登录系统时,安全始终是首要考虑的因素。以下是一些建议的最佳实践: - **使用HTTPS**:确保登录表单和登录后的会话都在加密的连接上传输。 - **密码存储**:永远不要以明文形式存储密码,使用安全的哈希算法(如bcrypt)来存储密码的哈希值。 - **防止SQL注入**:使用ORM或参数化查询来避免SQL注入攻击。 - **会话管理**:设置会话的过期时间,定期更新会话标识,并在用户登出时销毁会话。 - **跨站请求伪造(CSRF)保护**:Yii2默认启用了CSRF保护,确保不要禁用它。 通过遵循这些最佳实践,你可以大大提高你的Yii2应用的安全性。 ### 结语 在本章中,我们详细介绍了如何在Yii2框架中完成用户登录功能的实现。从规划登录流程、准备数据库和用户模型,到创建登录表单、编写登录逻辑,再到配置路由和控制器,我们一步步构建了一个健壮、安全的用户登录系统。希望
上一篇:
11.4 用于验证用户名和密码的身份类UserIdentity
下一篇:
11.6 保存用户登录状态的yii\web\User类
该分类下的相关小册推荐:
PHP8入门与项目实战(4)
Laravel(10.x)从入门到精通(十八)
Laravel(10.x)从入门到精通(一)
Laravel(10.x)从入门到精通(八)
Magento零基础到架构师(安装篇)
Laravel(10.x)从入门到精通(三)
Yii2框架从入门到精通(上)
Magento零基础到架构师(内容设计)
PHP8入门与项目实战(5)
Magento2主题开发高级实战
经典设计模式PHP版
全面掌握Magento2-从配置到优化