首页
技术小册
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.1 用户登录-表单模型 在Web应用开发中,用户登录功能是不可或缺的一部分,它为用户提供了一个安全的身份验证通道,确保只有合法用户才能访问系统的特定资源。Yii2框架作为一个高效、灵活的PHP开发框架,提供了丰富的组件和特性来支持这一功能的实现。在本章节中,我们将深入探讨Yii2框架中如何使用表单模型(Form Model)来实现用户登录功能。 #### 11.1.1 表单模型概述 在Yii2中,表单模型(通常继承自`\yii\base\Model`)主要用于处理表单数据,它不与数据库表直接关联,而是用于数据验证、收集用户输入等。这种设计模式有助于将数据的表示(表单视图)与数据的处理逻辑(模型)分离,使代码更加清晰、易于维护。 对于用户登录表单,我们需要创建一个表单模型来验证用户输入的用户名和密码是否符合一定的规则(如用户名不为空、密码长度符合要求等),并在验证通过后进一步处理登录逻辑。 #### 11.1.2 创建登录表单模型 首先,我们需要创建一个登录表单模型。在Yii2项目中,这通常意味着在`models`目录下创建一个新的PHP类文件,比如命名为`LoginForm.php`。 ```php <?php namespace app\models; use Yii; use yii\base\Model; class LoginForm extends Model { public $username; public $password; public $rememberMe = true; private $_user = false; /** * @return array the validation rules. */ public function rules() { return [ // username and password are both required [['username', 'password'], 'required'], // rememberMe must be a boolean value ['rememberMe', 'boolean'], // password is validated by validatePassword() ['password', 'validatePassword'], ]; } /** * Validates the password. * This method serves as the inline validation for password. * * @param string $attribute the attribute currently being validated * @param array $params the additional name-value pairs given in the rule */ public function validatePassword($attribute, $params) { if (!$this->hasErrors()) { $user = $this->getUser(); if (!$user || !$user->validatePassword($this->password)) { $this->addError($attribute, 'Incorrect username or password.'); } } } /** * Logs in a user using the provided username and password. * * @return bool whether the user is logged in successfully */ public function login() { if ($this->validate()) { return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0); } return false; } /** * Finds user by [[username]] * * @return User|null */ protected function getUser() { if ($this->_user === false) { $this->_user = User::findByUsername($this->username); } return $this->_user; } } ``` 在上面的代码中,`LoginForm`类包含三个公共属性:`username`、`password`和`rememberMe`,分别用于存储用户输入的用户名、密码和是否记住登录状态的选项。`rules()`方法定义了表单的验证规则,包括用户名和密码为必填项、`rememberMe`为布尔值,以及通过`validatePassword()`自定义验证方法验证密码的正确性。 `validatePassword()`方法内部调用了`getUser()`方法获取用户信息,并验证提供的密码是否与数据库中存储的哈希密码匹配。注意,密码的验证实际上是由用户模型(`User`)中的`validatePassword()`方法完成的,这里仅做示例说明。 `login()`方法用于在用户通过验证后执行登录操作,它首先调用`validate()`方法来确保数据的有效性,然后调用Yii2的内置登录功能(`Yii::$app->user->login()`)来执行实际的登录过程。 #### 11.1.3 用户模型中的密码验证 上述示例中提到的`User::findByUsername()`和`User`模型中的`validatePassword()`方法需要我们在用户模型(`User`)中实现。这里假设我们已经有了一个`User`模型,它对应数据库中的用户表。 ```php // 假设的User模型中的方法 /** * Finds user by username * * @param string $username * @return static|null */ public static function findByUsername($username) { return static::findOne(['username' => $username]); } /** * Validates password * * @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); } ``` 在`User`模型中,`findByUsername()`方法通过用户名查找用户记录,而`validatePassword()`方法则使用Yii2的安全组件(`Yii::$app->security`)来验证用户输入的密码是否与存储在数据库中的哈希密码匹配。 #### 11.1.4 表单视图与控制器 创建好表单模型后,接下来需要在视图中构建登录表单,并在控制器中处理表单的提交。 **视图(View)**: 在视图中,我们可以使用Yii2的表单小部件(`yii\widgets\ActiveForm`)来渲染登录表单。 ```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 = 'Login'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="site-login"> <h1><?= Html::encode($this->title) ?></h1> <p>Please fill out the following fields to login:</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('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?> </div> </div> <?php ActiveForm::end(); ?> </div> ``` **控制器(Controller)**: 在控制器中,我们需要创建一个操作(action)来处理登录表单的提交。 ```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(); } return $this->render('login', [ 'model' => $model, ]); } ``` 在这个`actionLogin`方法中,我们首先检查用户是否已经登录,如果是,则重定向到首页。否则,我们实例化一个`LoginForm`对象,尝试从POST请求中加载数据,并调用`login()`方法来尝试登录。如果登录成功,则重定向到之前的页面(如果有的话),否则渲染登录表单视图。 ### 总结 通过以上步骤,我们展示了如何在Yii2框架中使用表单模型来实现用户登录功能。这包括创建登录表单模型、在用户模型中实现密码验证逻辑、在视图中渲染登录表单以及在控制器中处理表单提交。这样的设计不仅提高了代码的可读性和可维护性,还充分利用了Yii2框架的组件化和验证机制,为开发高效、安全的Web应用提供了坚实的基础。
上一篇:
10.4 项目实现迭代十三:完成“添加用户”页面的AJAX验证
下一篇:
11.2 用户登录-客户端验证
该分类下的相关小册推荐:
Laravel(10.x)从入门到精通(十四)
PHP高并发秒杀入门与实战
ThinkPHP项目开发实战
PHP合辑3-数组函数
PHP8入门与项目实战(7)
PHP8入门与项目实战(3)
PHP面试指南
Laravel(10.x)从入门到精通(十七)
Laravel(10.x)从入门到精通(九)
Laravel(10.x)从入门到精通(七)
HTTP权威指南
Laravel(10.x)从入门到精通(十三)