本手册由软航科技Markdown编辑器自动生成,最后更新时间:📅 2025/09/13
教程 高级 前端后端DevOps

📖 文档摘要

本指南基于软航OFFICE文档控件的开发接口和实际应用场景,为开发人员提供安全配置和规范使用的建议,帮助开发人员正确、安全地集成和使用软航OFFICE文档控件。指南详细介绍了WebUserName属性配置、文档安全控制、数字证书配置、电子印章安全、网络安全设置等核心内容,帮助开发人员避免常见的"NTKO"作者问题,确保文档作者信息正确显示,并提供完整的安全配置检查清单。

软航OFFICE文档控件安全及规范使用建议指南

1. WebUserName属性安全配置

1.1 问题描述

在业务系统集成软航OFFICE文档控件时,经常出现文档作者和最后一次保存者显示为”NTKO”的情况。这是由于开发人员在集成控件时,直接复制了DEMO示例代码,未修改WebUserName属性导致的。

1.2 技术原理

WebUserName属性用于设置Word/WPS办公软件的用户名,主要影响:

1.3 安全配置建议

1.3.1 正确设置WebUserName属性

// 错误示例 - 直接使用DEMO代码
obj.WebUserName = "NTKO";

// 正确示例 - 使用实际用户名
obj.WebUserName = getCurrentUserName(); // 获取当前登录用户
// 或者
obj.WebUserName = "张三"; // 具体用户名

1.3.2 动态用户名设置

重要建议:业务系统应根据当前流程获取用户信息来设置WebUserName,确保文档作者信息与实际操作用户一致。

// 从业务系统获取当前用户信息
function setWebUserName() {
    var currentUser = getCurrentUserFromSystem();
    if (currentUser && currentUser.name) {
        obj.WebUserName = currentUser.name;
    } else {
        // 使用默认用户名或提示用户输入
        obj.WebUserName = "系统用户";
    }
}

// 根据业务流程获取用户信息
function setWebUserNameByProcess() {
    // 从当前登录会话获取用户信息
    var sessionUser = getCurrentSessionUser();
    if (sessionUser) {
        obj.WebUserName = sessionUser.displayName || sessionUser.username;
        return;
    }

    // 从业务表单获取用户信息
    var formUser = getFormUserInfo();
    if (formUser) {
        obj.WebUserName = formUser.name;
        return;
    }

    // 从工作流获取用户信息
    var workflowUser = getWorkflowCurrentUser();
    if (workflowUser) {
        obj.WebUserName = workflowUser.name;
        return;
    }

    // 最后使用系统默认值
    obj.WebUserName = "系统用户";
}

1.3.3 HTML参数设置

<!-- 错误示例 -->
<param name="WebUserName" value="NTKO">

<!-- 正确示例 -->
<param name="WebUserName" value="实际用户名">

1.4 问题排查和解决

1.4.1 排查步骤

  1. 检查业务系统代码

    • 搜索代码中的obj.WebUserName="NTKO"
    • 搜索HTML中的<param name="WebUserName" value="NTKO">
    • 检查业务系统是否使用了控件
  2. 检查官网演示影响

    • 确认用户是否访问过软航官网的在线编辑演示
    • 检查本地Office设置是否被演示代码修改

1.4.2 解决方案

  1. 删除错误配置

    // 删除或注释掉以下代码
    // obj.WebUserName = "NTKO";
    // <param name="WebUserName" value="NTKO">
    
  2. 设置正确的用户名

    obj.WebUserName = "实际用户名";
    
  3. 修改历史文档

    • 对于已生成的文档,需要手动修改作者信息
    • 在Word中:文件 → 信息 → 属性 → 高级属性 → 摘要

1.5 业务流程用户信息获取最佳实践

1.5.1 不同业务场景的用户信息获取

// 1. 办公自动化系统
function getOAUserInfo() {
    // 从OA系统获取当前登录用户
    var oaUser = getOACurrentUser();
    if (oaUser) {
        return oaUser.realName || oaUser.userName;
    }
    return null;
}

// 2. 工作流系统
function getWorkflowUserInfo() {
    // 从工作流引擎获取当前处理人
    var workflowUser = getWorkflowCurrentHandler();
    if (workflowUser) {
        return workflowUser.displayName || workflowUser.name;
    }
    return null;
}

// 3. 文档管理系统
function getDocumentUserInfo() {
    // 从文档管理系统获取文档创建者或编辑者
    var docUser = getDocumentCurrentUser();
    if (docUser) {
        return docUser.fullName || docUser.username;
    }
    return null;
}

// 4. 表单系统
function getFormUserInfo() {
    // 从表单系统获取提交者信息
    var formUser = getFormSubmitter();
    if (formUser) {
        return formUser.name || formUser.submitterName;
    }
    return null;
}

1.5.2 统一的用户信息获取策略

// 统一的用户信息获取和设置策略
function setWebUserNameByBusinessProcess() {
    var userName = null;

    // 按优先级获取用户信息
    var userInfoSources = [
        getCurrentSessionUser,      // 当前会话用户
        getWorkflowCurrentUser,     // 工作流当前用户
        getFormUserInfo,           // 表单用户信息
        getDocumentUserInfo,       // 文档用户信息
        getOAUserInfo              // OA系统用户
    ];

    // 依次尝试获取用户信息
    for (var i = 0; i < userInfoSources.length; i++) {
        try {
            userName = userInfoSources[i]();
            if (userName && userName.trim() !== '') {
                break;
            }
        } catch (e) {
            console.log('获取用户信息失败:', e);
            continue;
        }
    }

    // 设置WebUserName
    if (userName && userName.trim() !== '') {
        obj.WebUserName = userName.trim();
        console.log('WebUserName已设置为:', userName);
    } else {
        obj.WebUserName = "系统用户";
        console.warn('未获取到用户信息,使用默认值');
    }
}

1.5.3 用户信息验证和日志记录

// 用户信息验证和日志记录
function setWebUserNameWithValidation() {
    var originalUserName = obj.WebUserName;
    var newUserName = getCurrentBusinessUser();

    // 验证用户信息
    if (!newUserName || newUserName === 'NTKO') {
        console.error('无效的用户名:', newUserName);
        return false;
    }

    // 设置新用户名
    obj.WebUserName = newUserName;

    // 记录日志
    logUserInfoChange(originalUserName, newUserName);

    // 验证设置是否成功
    if (obj.WebUserName === newUserName) {
        console.log('WebUserName设置成功:', newUserName);
        return true;
    } else {
        console.error('WebUserName设置失败');
        return false;
    }
}

// 日志记录函数
function logUserInfoChange(oldName, newName) {
    var logInfo = {
        timestamp: new Date().toISOString(),
        oldUserName: oldName,
        newUserName: newName,
        systemInfo: navigator.userAgent,
        url: window.location.href
    };

    // 发送到服务器记录
    sendLogToServer(logInfo);
}

2. 文档安全控制

2.1 文档保护配置

// 设置文档只读保护
function setDocumentProtection() {
    var obj = OfficeControlObj;

    // 设置文档只读
    obj.SetReadOnly(true);

    // 禁止拷贝
    obj.IsNoCopy = true;
    obj.IsStrictNoCopy = true;

    // 删除宏以提高安全性
    obj.IsRemoveMacrosOnSave = true;
}

2.2 权限控制

// 权限控制配置
function configurePermissions() {
    var obj = OfficeControlObj;

    // 控制工具栏显示
    obj.ShowCommandBar = false; // 隐藏工具栏

    // 控制菜单显示
    obj.IsShowEditMenu = false; // 隐藏编辑菜单
    obj.IsShowFileMenu = false; // 隐藏文件菜单
    obj.IsShowInsertMenu = false; // 隐藏插入菜单
    obj.IsShowToolMenu = false; // 隐藏工具菜单

    // 控制文件菜单项
    obj.FilePrint = false; // 禁用打印功能
}

3. 数字证书和电子印章安全

3.1 数字证书配置

// 数字证书安全配置
function configureDigitalCertificate() {
    var obj = OfficeControlObj;

    // 设置CSP提供者
    obj.DS_CSPProviderName = "Microsoft Enhanced Cryptographic Provider v1.0";

    // 设置证书发行者
    obj.DS_CSPIssuerName = "CN=Your Certificate Authority, O=Your Organization";

}

3.2 电子印章安全

// 电子印章安全配置
function configureElectronicSeal() {
    var obj = OfficeControlObj;

    // 启用安全印章支持
    obj.IsSupportSecuritySign = true;

    // 设置印章服务器登录URL
    obj.SvrLoginUrl = "https://your-seal-server.com/ntkoSignServer/";

    // 检查文档中的服务器印章
    var plugInObj = obj.ActiveDocument;
    if (plugInObj) {
        plugInObj.SvrCheckSecsigns();
    }
}

4. 网络安全配置

4.1 网络传输安全

// 网络传输安全配置
function configureNetworkSecurity() {
    var obj = OfficeControlObj;

    // 设置网络超时时间
    obj.ConnectServerTimeOut = 60; // 连接超时60秒
    obj.ReceiveDataTimeOut = 300; // 接收数据超时300秒

    // 设置网络缓冲区大小
    obj.MaxNetworkBufferSize = 16 * 1024 * 1024; // 16MB

    // 启用UTF-8编码
    obj.IsUseUTF8URL = true;
    obj.IsUseUTF8Data = true;
}

4.2 文件上传下载安全

// 文件传输安全
function configureFileTransfer() {
    var obj = OfficeControlObj;

    // 注意:文件大小和类型限制需要在服务器端实现
    // 控件本身不提供这些属性
}

5. 日志和监控

5.1 操作日志记录

// 操作日志配置
function configureLogging() {
    // 注意:软航OFFICE文档控件本身不提供日志配置属性
    // 日志记录需要在业务系统中实现
    console.log("操作日志记录需要在业务系统中实现");
}

5.2 安全监控

// 安全监控配置
function configureSecurityMonitoring() {
    // 注意:软航OFFICE文档控件本身不提供安全监控属性
    // 安全监控需要在业务系统中实现
    console.log("安全监控需要在业务系统中实现");
}

6. 最佳实践建议

6.1 开发规范

  1. 用户信息管理

    • 避免硬编码用户名,特别是”NTKO”
    • 根据当前业务流程获取用户信息设置WebUserName
    • 从业务系统动态获取用户信息
    • 提供用户自定义用户名的选项
    • 实现用户身份验证和授权
    • 确保文档作者信息与实际操作用户一致
  2. 安全配置检查

    • 定期检查WebUserName属性设置
    • 验证数字证书配置
    • 检查网络传输安全设置
    • 审查权限控制配置
  3. 文档处理规范

    • 在文档保存前检查作者信息
    • 提供文档属性修改功能
    • 实现批量文档属性更新
    • 确保文档版本控制

6.2 部署建议

  1. 环境隔离

    • 开发、测试、生产环境分离
    • 使用不同的证书和配置
    • 避免演示代码影响生产环境
  2. 权限管理

    • 实施最小权限原则
    • 定期审查用户权限
    • 启用操作审计日志
  3. 安全更新

    • 定期更新控件版本
    • 及时修复安全漏洞
    • 监控安全公告

❓ 常见问题FAQ

Q: 为什么文档作者显示为"NTKO"?

A: 这是因为开发人员直接复制了DEMO示例代码,未修改WebUserName属性导致的。需要根据当前业务流程获取用户信息来设置WebUserName属性。

Q: 如何正确设置WebUserName属性?

A: 应该从业务系统动态获取当前用户信息,避免硬编码"NTKO"。可以使用getCurrentUserFromSystem()等方法获取用户信息。

Q: 如何配置文档安全控制?

A: 可以使用SetReadOnly()设置文档只读,使用IsNoCopy和IsStrictNoCopy禁止拷贝,使用IsRemoveMacrosOnSave删除宏等。

Q: 数字证书如何配置?

A: 使用DS_CSPProviderName设置CSP提供者,使用DS_CSPIssuerName设置证书发行者,确保数字证书的正确配置。

Q: 电子印章安全如何设置?

A: 启用IsSupportSecuritySign支持安全印章,设置SvrLoginUrl配置印章服务器,使用SvrCheckSecsigns()检查印章。

Q: 网络传输安全如何配置?

A: 设置ConnectServerTimeOut和ReceiveDataTimeOut控制超时时间,配置MaxNetworkBufferSize设置缓冲区大小,启用UTF-8编码。