控制对未来内容的访问

时间:2014-11-18 10:56:55

标签: security authorization plone access-control

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

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

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

在我们的案例中,一份报纸,我们不仅拥有(内容未来的时间),而且我们还有不同的用户角色,需要或不必看到内容(付费订阅者/高级用户... )。

检查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

但问题是:因为必须在整个网站(引导页面,文章,交叉链接,导航,搜索......)中使用它,所以感觉不对,并且必须重复所有这些并且非常繁琐这到处检查。

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

2 个答案:

答案 0 :(得分:4)

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

collective.wfeffectiverange

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

有关详细信息,请参阅https://pypi.python.org/pypi/collective.wfeffectiverange

答案 1 :(得分:2)

1。)创建您希望拥有的每个权限级别的内容类型(' premium','付费订阅者')并为每个特权级别分配一个专用工作流程,至少保留各州'编辑审查'和'高级发布的',分别编辑 - 评论'和' paidsub-published',并将状态连接到等效角色('编辑',高级用户'' paidsubscribers'),以授予查看权限, 如预期。 此外,建议为每个角色创建一个组,将它们连接在一起,并将用户分配给组,而不是角色。

2。)使用collective.contentrules.comingsoon来应用一个用于设置“编辑 - 审核”状态的协会。当满足发布日期时(通过浏览器视图执行,由cron触发),分别对高级发布的'编辑 - 评论&#39 ;.

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