Plone 如果用户没有';如果我没有权限呈现视图(在configure.zcml上配置),我如何引发禁止而不是重定向到登录表单?

Plone 如果用户没有';如果我没有权限呈现视图(在configure.zcml上配置),我如何引发禁止而不是重定向到登录表单?,plone,Plone,我有一个浏览器视图,带有一些实用程序。主要是一个“实用程序视图”,我使用旧式pt模板(位于皮肤文件夹中)遍历它。我的浏览器/configure.zcml: <browser:page for="*" name="my_view" class=".myview.MyView" allowed_interface=".myview.IMyView" permission="my.permission" /> 到

我有一个浏览器视图,带有一些实用程序。主要是一个“实用程序视图”,我使用旧式pt模板(位于
皮肤
文件夹中)遍历它。我的
浏览器/configure.zcml

  <browser:page
      for="*"
      name="my_view"
      class=".myview.MyView"
      allowed_interface=".myview.IMyView"
      permission="my.permission"
      />
到目前为止,一切顺利。没有
my.permission
的用户尝试进入
/Plone/template.pt
将失败。但是Plone重定向到登录表单,我更愿意提出一个禁止的异常。比如:

    <span tal:define="my_view here/@@myview | here/raiseForbidden">
    </span>

…但是,当然,这不起作用,因为视图渲染没有引发错误。(我知道here/raiseForbidden不存在,通常使用的是here/raiseUnauthorized,但概念相同)


我的问题是:有可能吗?在某处配置我的权限,或在我的视图中配置某种方法(如
渲染
\uuuu调用
),当用户没有权限渲染它时,

实际上您不需要这样做:

“tal:define=“我的视图在这里/@@myview>”

因为对于浏览器视图,有一个名为“view”的默认变量已经包含了您的类

要引发异常,应从zml指令中删除权限检查,并按如下方式修改类:

from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from AccessControl import getSecurityManager
from AccessControl import Unauthorized

class YourBrowserView(BrowserView):
    """ .. """
    index = ViewPageTemplateFile("templates/yourtemplate.pt")

    ...

    def __call__(self):
        if not getSecurityManager().checkPermission(your.permission, self.context):
            raise Unauthorized("You are not authorized! Go away!")
        else: return index()
再见
Giacomo

实际上你不需要这样做:

“tal:define=“我的视图在这里/@@myview>”

因为对于浏览器视图,有一个名为“view”的默认变量已经包含了您的类

要引发异常,应从zml指令中删除权限检查,并按如下方式修改类:

from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from AccessControl import getSecurityManager
from AccessControl import Unauthorized

class YourBrowserView(BrowserView):
    """ .. """
    index = ViewPageTemplateFile("templates/yourtemplate.pt")

    ...

    def __call__(self):
        if not getSecurityManager().checkPermission(your.permission, self.context):
            raise Unauthorized("You are not authorized! Go away!")
        else: return index()
再见
Giacomo

Plone重定向到登录表单,因为您提出了未经授权的请求。如果你想要不同的行为,你需要做一些不同的事情


在这种情况下,您可以直接将用户重定向到新页面,并根据情况定制错误消息

Plone重定向到登录表单,因为您提出了未经授权的请求。如果你想要不同的行为,你需要做一些不同的事情


在这种情况下,您可以直接将用户重定向到新页面,并根据情况定制错误消息

template.pt
位于
skins
内部,而不是
browser
ViewPageTemplateFile
是否能够呈现
skins
文件夹中的内容?问题不在提升中;这很有效。问题是重定向到登录表单。无论如何,在这种情况下,您应该使用遍历而不是ViewPageTemplateFile:“else:return self.context.portal_skins.custom['template.pt']()”,其中custom是模板所在的皮肤层名称。但我认为您应该考虑使用正确的方式使用代码>模板。
ViewPageTemplateFile
是否能够呈现
skins
文件夹中的内容?问题不在提升中;这很有效。问题是重定向到登录表单。无论如何,在这种情况下,您应该使用遍历而不是ViewPageTemplateFile:“else:return self.context.portal_skins.custom['template.pt']()”,其中custom是模板所在的皮肤层名称。但我认为您应该考虑使用正确的方式使用浏览器视图/模板,我希望<代码>禁止/代码>异常。我应该这样做@giacomos
\uuuu调用\uuuuu
解决方案,但提出
禁止
?或者基于raiseUnauthorized脚本创建您自己的raiseForbidden方法。在架构方面,把它放在视图
\uuuuuu调用\uuuuu
对我来说有点好闻。我同意。你甚至两年前就回答过一个类似的问题唉,我老是忘了时间机器!警告,时间旅行可能导致副作用;包括但不限于健忘症。你说得对,我想要禁止的例外。我应该这样做@giacomos
\uuuu调用\uuuuu
解决方案,但提出
禁止
?或者基于raiseUnauthorized脚本创建您自己的raiseForbidden方法。在架构方面,把它放在视图
\uuuuuu调用\uuuuu
对我来说有点好闻。我同意。你甚至两年前就回答过一个类似的问题唉,我老是忘了时间机器!警告,时间旅行可能导致副作用;包括但不限于健忘症。