You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:06:02