一种在zope中重定向某些角色的简单方法

时间:2009-08-03 15:07:37

标签: zope

我有一段zope 2网站,它在“内容”和网站范围的宏之间使用了一个临时宏。我不想对文件夹应用安全性,但我希望临时宏将用户重定向到登录屏幕,如果他们尝试加载使用它的页面。

这方面的一个例子是:

page_html包含内容,它使用special_template中的宏,然后插入standard_template中的宏。因此我希望它重定向到登录屏幕。如果page_html没有使用special_template,而是直接使用standard_template(这是网站上的大多数页面所做的那样),我不希望它重定向。

我怎么能实现这个目标?

1 个答案:

答案 0 :(得分:2)

首先,为什么不重构您的网站,将所有需要身份验证的网页放在您可以使用Zope权限保护的位置?自定义(本地)工作流可以逐个州和逐个位置应用权限,因此使用Zope自己的自动身份验证框架。如果您不使用工作流,则自定义类型仍然可以应用URL空间中由其下方的任何内容获取的权限。

您可以从special_template宏中创建一个方法(Zope3视图,皮肤层中的Python脚本,获取上下文中内容类的方法,外部方法,按照最佳实践的粗略顺序)通过tal:define语句。我会在这里将输出分配给一个虚拟变量,因为你不关心它,我们会将它用于它的副作用。以下示例假设您已经采用Z3视图方式:

<body tal:define="dummy context/@@redirect_if_anonymous">

这将实现使用名称redirect_if_anonymous注册的视图。在视图中,您可以使用标准Zope API方法或cookie测试来测试您的Web访问者是否已经过身份验证,具体取决于您的应用程序。这是一个标准的API示例,它会引发Unauthorized强制登录。

from Products.Five import BrowserView
from AccessControl import getSecurityManager, Unauthorized
from AccessControl.SpecialUsers import nobody

class RedirectAnonymous(BrowserView):
    def __call__(self):
        sm = getSecurityManager()
        user = sm.getUser()
        if user is None or user is nobody:
             raise Unauthorized

如果你想要的只是重定向到另一个位置,只需使用response.redirect():

url = self.request['URL0'] + '/login.html'
self.request.response.redirect(url)

如果您想首先测试cookie,cookie是请求变量的一部分:

if 'mycookie' not in self.request.cookies:
    self.request.response.redirect(url)