如何在不反复查询权限的情况下检测 ACC 文件夹权限变更?
能否不查询权限就发现变更?
父文件夹的更新时间和通用文件夹 webhook 都不能可靠地标记权限变更。要只查询权限发生变化的文件夹,需要有能够覆盖这些变更的通知或增量记录,或者由应用掌握全部权限写入操作。
本次查阅的 Autodesk 公开资料未能确认是否存在可完整追踪 ACC 文件夹权限变更的专用事件或增量查询机制。因此,如果管理员还会通过 ACC 界面或其他集成修改权限,仍需周期性核对权限。可以降低查询频率、避免重复同步,但无法保证既完全免除查询又不漏掉变更。
父文件夹能提供什么信息?
Data Management 的文件夹接口提供 lastModifiedTime 和 lastModifiedTimeRollup。后者描述文件夹或其子项的最近更新时间,但文档没有明确保证权限变更一定会更新这些字段。因此,即使 Drawings 的时间戳没有变化,也不能跳过 Folder_6 的权限检查。If-Modified-Since 同样不能直接证明权限未变。文件夹查询接口文档
子文件夹会继承父文件夹的权限,父级权限调整可能影响下级。父级未发生变化,也不能说明子文件夹没有单独调整权限。文件夹权限管理说明
Webhooks 和 audit logs 能否替代轮询?
Webhooks 只能用于明确支持的事件。不能仅凭 dm.folder.modified 的名称,就认定它覆盖权限的新增、修改和删除。本次未取得能确认该覆盖范围的官方事件说明,因此不宜将它作为权限同步的唯一触发器。
官方说明指出,文件夹 webhook 的 scope 可以递归覆盖子项。在父文件夹上订阅已支持的事件,可以扩大监听范围,但这并不意味着事件本身能覆盖权限变更。Webhooks Field Guide
使用 audit logs 前,需要确认是否有可供程序消费的变更记录。即使管理界面能查看日志,也要进一步确认:
- 是否记录权限的新增、修改和删除,并包含目标文件夹 ID。
- 是否有适用于当前产品和项目的公开读取 API。
- 是否支持稳定分页、增量游标,以及足够的保留期限。
在确认这些条件之前,不能把日志当作完整的权限同步来源。
如何减少调用和重复同步?
可以根据权限修改入口选择方案。
| 修改方式 | 可采用的方案 | 适用限制 |
|---|---|---|
| 全部通过自己的应用修改 | 权限写入成功后,将受影响文件夹加入刷新队列 | 必须覆盖所有写入入口 |
| ACC 界面和多个集成都能修改 | 本地权限快照、分层轮询和周期性完整核对 | 存在由轮询周期决定的检测延迟 |
| 已确认有完整的权限事件或日志接口 | 按通知刷新目标文件夹,并保留核对任务 | 必须确认事件覆盖范围和恢复机制 |
具体可以这样做:
- 建立初始快照。读取需要管理的文件夹权限,在本地保存规范化后的授权记录。官方 Folder Permission API 提供按文件夹读取、创建、更新和删除权限的接口。Folder Permission API 说明
- 记录应用内写入。权限修改成功后,将目标文件夹加入队列;涉及继承时,标记可能受影响的后代。短时间内对同一文件夹的多次修改可以合并刷新。
- 按需读取并比较。定时任务或刷新队列读取完整权限数据,规范化后与快照比较,仅在变化时执行下游同步。
- 安排周期性核对。活跃文件夹可以更频繁检查,稳定文件夹可以降低检查频率,但仍需定期覆盖全部目标,以发现应用外的修改。
快照比较可以减少重复写入和下游处理;要提前知道哪些权限查询可以省略,还需要可靠的变更来源。
权限快照如何比较?
下面的 Python 示例只负责生成本地摘要。normalized_entries 是应用根据实际 API 响应整理出的授权记录,并非 Autodesk 定义的响应结构。
import hashlib
import json
def permission_digest(normalized_entries):
# 调用方须先统一字段,并对 actions 等无序集合排序、去重。
rows = [
json.dumps(
entry,
sort_keys=True,
ensure_ascii=False,
separators=(",", ":"),
)
for entry in normalized_entries
]
canonical = json.dumps(
sorted(rows),
ensure_ascii=False,
separators=(",", ":"),
)
return hashlib.sha256(canonical.encode("utf-8")).hexdigest()
规范化时,应保留授权主体类型、主体 ID、权限动作,以及接口实际返回且影响判断的继承信息,排除请求时间等临时字段。如果响应存在分页,必须读取完整结果再比较。下游同步成功后再提交新摘要,避免因快照提前更新而跳过失败任务。
实施时还要注意什么?
- 摘要表示已读取数据的状态。本地 hash 无法在调用 API 前告知远端是否改变;两次检查之间的短暂变更也可能无法通过快照发现。
- 授权记录与用户最终访问权限有区别。用户的角色、公司归属或管理员身份变化,也可能影响访问能力。如果同步目标是用户的有效权限,需要同时考虑这些信息。文件夹权限管理说明
- 查询失败不能视为空权限。遇到
403、429或其他错误时,保留旧快照并记录失败;不要将失败结果同步为权限清空。 - 轮询周期取决于允许的延迟。如果业务要求立即发现任何入口的权限变化,而平台又没有覆盖这些变化的可靠通知或变更记录,单靠缓存和父文件夹元数据无法满足要求。
备注:内容仅供参考。
