首先,为什么不重新组织您的网站将所有这些需要身份验证的页面放到您可以使用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)
如果你想测试饼干第一,饼干请求变量的一部分:
if 'mycookie' not in self.request.cookies:
self.request.response.redirect(url)
有一件事我忘了说是这样的(不要拍我要说明明显) - 这仅需要发生匿名用户,所以任何身份验证的应用将不再需要重新登录 – chrism 2009-08-03 15:10:28