2009-08-03 18 views
1

我有一段zope 2站点,它在'内容'和站点范围的宏之间使用临时宏。我不想将安全性应用到文件夹,但是我希望临时宏将用户重定向到登录屏幕,如果他们尝试加载使用它的页面。在zope中重定向某些角色的简单方法

这样的一个例子是这样的:

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

我怎么能做到这一点?

+0

有一件事我忘了说是这样的(不要拍我要说明明显) - 这仅需要发生匿名用户,所以任何身份验证的应用将不再需要重新登录 – chrism 2009-08-03 15:10:28

回答

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) 

如果你想测试饼干第一,饼干请求变量的一部分:

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