2009-08-03 20 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)