📖 文档摘要
本指南基于软航OFFICE文档控件的开发接口和实际应用场景,为开发人员提供安全配置和规范使用的建议,帮助开发人员正确、安全地集成和使用软航OFFICE文档控件。指南详细介绍了WebUserName属性配置、文档安全控制、数字证书配置、电子印章安全、网络安全设置等核心内容,帮助开发人员避免常见的"NTKO"作者问题,确保文档作者信息正确显示,并提供完整的安全配置检查清单。
软航OFFICE文档控件安全及规范使用建议指南
1. WebUserName属性安全配置
1.1 问题描述
在业务系统集成软航OFFICE文档控件时,经常出现文档作者和最后一次保存者显示为”NTKO”的情况。这是由于开发人员在集成控件时,直接复制了DEMO示例代码,未修改WebUserName
属性导致的。
1.2 技术原理
WebUserName
属性用于设置Word/WPS办公软件的用户名,主要影响:
- 文件修订模式下的编辑者信息显示
- 最后一次保存者信息
- 新建文件的作者信息
- 通过Office另存为PDF时的作者信息
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 排查步骤
检查业务系统代码
- 搜索代码中的
obj.WebUserName="NTKO"
- 搜索HTML中的
<param name="WebUserName" value="NTKO">
- 检查业务系统是否使用了控件
- 搜索代码中的
检查官网演示影响
- 确认用户是否访问过软航官网的在线编辑演示
- 检查本地Office设置是否被演示代码修改
1.4.2 解决方案
删除错误配置
// 删除或注释掉以下代码 // obj.WebUserName = "NTKO"; // <param name="WebUserName" value="NTKO">
设置正确的用户名
obj.WebUserName = "实际用户名";
修改历史文档
- 对于已生成的文档,需要手动修改作者信息
- 在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 开发规范
用户信息管理
- 避免硬编码用户名,特别是”NTKO”
- 根据当前业务流程获取用户信息设置WebUserName
- 从业务系统动态获取用户信息
- 提供用户自定义用户名的选项
- 实现用户身份验证和授权
- 确保文档作者信息与实际操作用户一致
安全配置检查
- 定期检查WebUserName属性设置
- 验证数字证书配置
- 检查网络传输安全设置
- 审查权限控制配置
文档处理规范
- 在文档保存前检查作者信息
- 提供文档属性修改功能
- 实现批量文档属性更新
- 确保文档版本控制
6.2 部署建议
环境隔离
- 开发、测试、生产环境分离
- 使用不同的证书和配置
- 避免演示代码影响生产环境
权限管理
- 实施最小权限原则
- 定期审查用户权限
- 启用操作审计日志
安全更新
- 定期更新控件版本
- 及时修复安全漏洞
- 监控安全公告
❓ 常见问题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编码。