Yii 1.1.19系统中实现删除模型前的密码确认功能
实现Yii 1.1删除前验证用户密码的方案
刚好我对Yii 1.1这套老框架还算熟,给你一步步拆解怎么把原来的确认弹窗改成密码验证的流程,保证兼容你现有的代码结构:
1. 改造删除按钮的触发逻辑
原来直接用submit+confirm的方式要换掉,改成触发自定义弹窗的链接,去掉自动提交参数,换成自定义类名和存储用户ID的data属性,方便后续JS调用:
$this->menu = array( array( 'label' => 'Delete User', 'url' => '#', 'linkOptions' => array( 'class' => 'delete-user-btn', 'data-user-id' => $model->id, // 存要删除的用户ID ) ) );
2. 添加密码验证的弹窗HTML
在视图页面底部(或合适位置)添加隐藏的弹窗结构,包含密码输入框、操作按钮和错误提示:
<!-- 密码验证弹窗 --> <div id="password-confirm-modal" style="display: none; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); padding: 20px; background: #fff; border-radius: 4px; box-shadow: 0 0 10px rgba(0,0,0,0.2); z-index: 1000;"> <p style="margin: 0 0 15px;">请输入您的密码以确认删除:</p> <input type="password" id="verify-password" name="verifyPassword" style="width: 100%; padding: 8px; box-sizing: border-box;"> <div id="password-error" style="color: #dc3545; margin-top: 10px; display: none;"></div> <div style="margin-top: 15px; text-align: right;"> <button id="cancel-delete-btn" style="margin-right: 10px; padding: 6px 12px;">取消</button> <button id="confirm-delete-btn" style="padding: 6px 12px; background: #dc3545; color: #fff; border: none; border-radius: 4px;">确认删除</button> </div> </div> <!-- 弹窗遮罩层 --> <div id="modal-overlay" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 999;"></div>
3. 编写JavaScript处理弹窗和密码验证逻辑
用Yii 1.1自带的jQuery实现交互:弹窗显示、AJAX密码验证、验证通过后提交删除表单:
$(function() { // 点击删除按钮弹出密码验证弹窗 $('.delete-user-btn').click(function(e) { e.preventDefault(); // 存储当前要删除的用户ID window.currentDeleteUserId = $(this).data('user-id'); // 重置弹窗状态 $('#verify-password').val(''); $('#password-error').hide(); // 显示弹窗和遮罩 $('#password-confirm-modal').show(); $('#modal-overlay').show(); }); // 取消按钮隐藏弹窗 $('#cancel-delete-btn').click(function() { $('#password-confirm-modal').hide(); $('#modal-overlay').hide(); }); // 点击确认删除:发送AJAX验证密码 $('#confirm-delete-btn').click(function() { var password = $('#verify-password').val().trim(); var userId = window.currentDeleteUserId; // 先校验输入不为空 if (!password) { $('#password-error').text('请输入密码').show(); return; } // 发送AJAX请求到后端验证密码 $.ajax({ url: '<?php echo Yii::app()->createUrl("user/verifyPassword"); ?>', type: 'POST', data: { password: password, userId: userId, // 带上Yii的CSRF令牌,防止跨站请求伪造 '<?php echo Yii::app()->request->csrfTokenName; ?>': '<?php echo Yii::app()->request->csrfToken; ?>' }, dataType: 'json', success: function(response) { if (response.success) { // 密码验证通过,动态创建表单提交删除请求 var deleteForm = $('<form>', { 'method': 'POST', 'action': '<?php echo Yii::app()->createUrl("user/delete"); ?>' }); // 添加删除ID参数 deleteForm.append($('<input>', { 'type': 'hidden', 'name': 'id', 'value': userId })); // 添加CSRF令牌 deleteForm.append($('<input>', { 'type': 'hidden', 'name': '<?php echo Yii::app()->request->csrfTokenName; ?>', 'value': '<?php echo Yii::app()->request->csrfToken; ?>' })); // 提交表单 deleteForm.appendTo('body').submit(); } else { // 密码错误显示提示 $('#password-error').text(response.message || '密码不正确').show(); } }, error: function() { $('#password-error').text('验证请求失败,请稍后重试').show(); } }); }); });
4. 后端添加密码验证的Action
在UserController里新增actionVerifyPassword方法,处理AJAX密码验证请求:
public function actionVerifyPassword() { // 只接受AJAX请求 if (!Yii::app()->request->isAjaxRequest) { throw new CHttpException(400, 'Invalid request.'); } $password = Yii::app()->request->getPost('password'); // 注意:如果是管理员删除用户需验证自己的密码,取当前登录用户;如果是删除自己账号,可根据传的userId取模型 $currentUser = Yii::app()->user->model; // 验证密码(假设User模型有validatePassword方法) if ($currentUser->validatePassword($password)) { echo CJSON::encode(['success' => true]); } else { echo CJSON::encode(['success' => false, 'message' => '密码不正确']); } Yii::app()->end(); }
补充:User模型的密码验证方法
如果模型还没有该方法,根据密码存储方式添加:
// 用Yii自带CPasswordHelper生成的哈希密码 public function validatePassword($password) { return CPasswordHelper::verifyPassword($password, $this->password); } // 老项目用MD5哈希的情况(不推荐) // public function validatePassword($password) // { // return md5($password) === $this->password; // }
5. 确认删除Action的CSRF验证
确保actionDelete只接受POST请求,且开启CSRF验证(Yii 1.1默认开启):
public function actionDelete($id) { if (Yii::app()->request->isPostRequest) { // 可添加额外权限校验 $model = $this->loadModel($id); $model->delete(); // AJAX请求返回JSON,否则跳转 if (!Yii::app()->request->isAjaxRequest) { $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : ['admin']); } } else { throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.'); } }
这套流程下来,用户点击删除按钮后会弹出密码输入框,验证通过才会执行删除操作,完全替代原来的简单confirm弹窗。
内容的提问来源于stack exchange,提问作者grhmstwrt
相关产品推荐
相关产品推荐

