跳转到主要内容

优化Plone网站对象安全索引。

项目描述

https://api.travis-ci.org/ploneintranet/experimental.securityindexing.png https://coveralls.io/repos/ploneintranet/experimental.securityindexing/badge.png

实验性安全索引

描述

本软件包旨在解决Plone中一个长期存在的性能问题

在需要重新索引对象安全的情况下,例如通过@@sharing视图添加用户或组的角色时,将无条件地从数据库(ZODB)检索用于共享表单的对象及其所有内容树中的子对象,并重新索引其安全属性(allowedRolesAndUsers)。

这可能会在某些网站上导致性能极差,具体取决于大小(对象数量)和工作流程复杂性。

安装

要安装此软件包,将实验性安全索引添加到您的Plone站点 eggs,并重新运行buildout

测试

此软件包提供了一些简单的基准测试,旨在作为健全性测试,回答以下问题

“我们是否至少比默认实现快?”

这些基准测试不应被视为权威的,也不应表明您在真实站点上应该期望的性能。

为此,确定结果的最佳方式是在您的站点开发/预发布版本中安装软件包并针对一些真实数据执行。

安装方法与上述相同,但添加额外的[benchmarks,tests]

有关详细信息,请阅读基准文档

Plone 4.x站点中的现有行为

当在特定文件夹类内容项上分配本地角色给用户时,该文件夹将被索引以及所有其子项(子文件夹) - 无条件。

这取决于以下组合

  • 树的结构

  • 子内容项的数量(正在编辑的对象下子树的深度和宽度)

目前,该行为通过方法 reindexObjectSecurity 实现了两次(Dexterity和Archetypes)。此方法在本地角色被操作的上下文中调用,以反映在 ZCatalog 中的 allowedRolesAndUsers Keywordindex 中的更改。

allowedRolesAndUsers 索引用于Plone以确定用户可以看到哪些内容。例如

在网站搜索中

在Plone 4.x站点中,reindexObjectSecurity API的两个实现是

  • Products.CMFCore.CMFCatalogAware.CatalogAware.reindexObjectSecurity(skip_self=False):索引内容项(self)。当从 @@sharing 动作调用时,关键字参数 skip_self 将为 False。对于内容项“下”此内容项的每个子节点,通过 ZCatalog.unrestrictedTraverse API 获取该对象,最终通过索引每个子节点,无条件。

  • Products.Archetypes.CatalogMultiplex.CatalogMultiplex:archetypes 工具用于查找已为内容项(self)的 meta_type 注册的所有目录。

注意:这两个实现都实现了 Products.CMFCore.interfaces.ICatalogAware 接口。

昂贵的操作似乎是

  1. 通过 unrestrictedTraverse “唤醒”每个子节点

  2. 当分配有意义的本地角色时,本地角色索引器(Products.CMFPlone.CatalogTool.allowedRolesAndUsers)调用 Products.PlonePAS.plugins.local_roles.LocalRolesManager.getAllLocalRolesInContext API,为每个要索引的对象执行以下算法

    1. 获取内部上下文。

    2. 获取内容对象及其父对象,并计算内容对象的唯一本地角色集。

    3. 如果未设置 __ac_block_local_roles__,则退出并返回计算出的本地角色。

    4. 重复 2,直到父对象为 None(树的根)。

解决之前描述的性能问题的任何解决方案的目标是

  1. 尽可能唤醒最少的对象。

  2. 当本地角色信息没有更改时,避免重新索引。

以下方案是为了优化上述算法

  1. 当一个对象首次索引 CatalogTool.indexObject 时,持久化一个代表唯一本地角色集和 __ac_local_roles_block__ 标志的唯一令牌,以及对象 id 和物理路径,在具有与主内容树(ZODB)相同形式的“阴影树”中。

  2. 尽可能避免重新索引,避免唤醒内容对象

2.1 给定一个内容项 obj,确定需要重新索引的子对象集

从阴影树中检索对应于 obj 的节点,以及代表 obj 的对应子代的节点,并按唯一本地角色对这些节点进行分组

2.2 对于每个节点组,检索对应于组中第一个节点的内容对象

2.3 询问第一个对象其 allowedRolesAndUsers(即本地角色)

2.4 索引组中的每个节点,提供一个假对象(即阴影节点或其他代表内容对象的对象)

致谢

这项工作是在 Plone Intranet 项目 的部分完成的。工作由 Netsight Internet Solutions 赞助。

变更日志

0.6 (2014-06-04)

  • 尚未更改。

0.5 (2014-06-04)

  • 尚未更改。

0.4 (2014-06-04)

  • 修复版本元数据,为新版本提升版本号。

0.2 (2014-06-04)

  • 纠正包元数据。

  • 更新 README.rst 以删除错误命名的分支在徽章 URL 中。

  • 同步/查看状态的控制面板配置程序。

  • 使用itertools对节点进行分组

  • shadowtree工具现在是一个站点本地工具(但由全局实用程序管理)

  • 添加功能测试

0.2dev(未发布)

0.1dev(未发布)

0.1 (2014-05-16)

  • 初始pypi发布。

0.1 (2014-05-16)

  • 初始pypi发布。

项目详情


下载文件

下载适合您平台的应用程序。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源代码分发

experimental.securityindexing-0.6.zip (51.9 kB 查看哈希值)

上传时间 源代码

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面