【问题标题】:Control access on future content控制对未来内容的访问
【发布时间】:2014-11-18 10:56:54
【问题描述】:

这主要是关于未来的公共内容,但不仅如此。

在标准的 Plone 站点中,如果您创建的顶级内容不显示在导航上(仍然是私有的),那么您将其公开(通过工作流程)并显示在导航上,但稍后您会计时将来它会再次从导航中消失。

此时,如果匿名/登录用户知道 URL,他们将能够看到内容。

在我们的例子中,报纸,我们不仅有那个(内容定时到未来),而且我们还有不同的用户角色,他们需要或不需要看到这些内容(付费订阅者/高级用户...... )。

检查View 权限,即

security = getSecurityManager()
if security.checkPermission('View', obj):
   # user can see the object

还不够。

检查查看权限以及内容是否在未来,即

security = getSecurityManager()
if security.checkPermission('View', obj) and \
        not object.effective_date.isFuture():
   # user can see the object

再一次是不够的,因为某些用户确实需要查看未来的内容(即内容编辑器),而普通用户不应该看到它们,而且高级用户应该确实看到它们,所以这样的事情实际上可以做到:

security = getSecurityManager()
if security.checkPermission('View', obj) and \
        (not object.effective_date.isFuture() or 
         security.checkPermission('Can see future content', obj):
   # user can see the object

但问题是:因为这必须在整个网站中使用(引导页面、文章、交叉链接、导航、搜索......)感觉不对,而且必须重复所有内容非常乏味这会到处检查。

还有其他方法可以解决这个问题吗?

【问题讨论】:

标签: security authorization plone access-control


【解决方案1】:

有一个插件产品可以完全满足您的需求:

collective.wf有效范围

它通过添加一个 cron 作业来查找尚未发布(未来生效日期)或已过期(已达到到期日期)的内容,并在这种情况下应用工作流转换。

更多信息请参见https://pypi.python.org/pypi/collective.wfeffectiverange

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • @goodMan 如果链接指向解释如何进行特定设置的博文,我同意。但是由于这个链接指向一个现有的克隆插件,我个人认为在这种情况下简单地添加一个链接就足够了。即使 github 存储库被移动,人们仍然可以搜索包名。无论如何,我更新了答案,如果你删除你的反对票,我会很高兴
  • 感谢您指出这个插件!还没有意识到。对于稍微复杂的用例看起来很有希望,比如用户还需要设置destination-wf-state。当只有一个想要的目标状态时,无需额外的用户操作即可定义它,如上面的 c.comingsoon-answer 中所示。
【解决方案2】:

1.) 为您希望拥有的每个权限级别(“高级”、“付费订阅者”)创建一个内容类型,并为每个级别分配一个专用工作流,至少包含“编辑评论”和“高级发布”状态',分别是 'editors-review' 和 'paidsub-published',并将状态连接到等效角色('editors'、premiumusers'、'paidsubscribers'),以按预期授予查看权限。 此外,建议为每个角色创建一个组,将它们连接在一起,然后将用户分配给组,而不是分配给角色。

2.) 使用collective.contentrules.comingsoon 应用内容规则,将状态从“editors-review”设置为“premium-published”,分别为“editors-review”,当发布日期满足时(通过浏览器视图执行,由 cron 触发)。

3.) 要克服 Plone 的默认设置,未来设置了发布日期的项目不会出现在导航元素中,您需要自定义/覆盖引用模板。这将包括 globalnav、navportlet、sitemap、folder_listing 等。

【讨论】:

  • 1) 行不通,我们的目标是让每个人都能在某个时候看到所有内容,因此我们确实需要保持单一的内容类型和单一的工作流程
  • 3) 这对我们来说不是问题,我们几乎没有导航元素
  • 1) 也许我没有很好地理解您描述的要求。原理应该是一样的,只要让cron把wf-state切换到published即可。每个内容类型的建议是为了代表高级/付费订阅区别。
猜你喜欢
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
相关资源
最近更新 更多