一个简单的方法来重定向Zope中的某些角色(An easy way to redirect cert

2019-07-31 07:20发布

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

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

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

我怎么能做到这一点?

Answer 1:

首先,为什么不调整你的网站把那个需要你可以使用Zope的权限保护的地点验证所有这些页面? 自定义(本地)工作流可以在一个国家的状态和位置,通过定位的基础上应用的权限,从而使用Zope的自己的自动身份验证框架。 如果你不使用工作流,自定义类型仍然可以申请由它下面的任何URL中的空间中获得的权限。

您可以创建一个方法(Zope3视图,Python脚本在表皮层,在你并购背景下,外部方法内容类的方法,以最佳实践粗糙顺序)从您的special_template宏借助所谓的一个TAL:define语句。 我会在这里分配输出到一个虚拟变量,因为你不关心这个,我们将使用它为它的副作用。 下面的例子假设你已经走了Z3的视图方式:

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

这将实例化与名义注册的视图redirect_if_anonymous 。 在视图中,可以再测试,如果你的网站访问已经被认证,使用标准的Zope API方法或一个cookie的测试,这取决于你的应用程序。 这是一个标准的API例如,它会提高无权强制登录。

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)


文章来源: An easy way to redirect certain roles in zope
标签: zope