1

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

这方面的一个例子是:

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

我怎么能做到这一点?

4

1 回答 1

2

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

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

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

这将实例化以 name 注册的视图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)
于 2009-08-04T10:32:43.023 回答