Python 如何在Plone中生成自定义403 HTTP响应(防止重定向)

Python 如何在Plone中生成自定义403 HTTP响应(防止重定向),python,plone,Python,Plone,在未经授权的访问时,Plone默认情况下会重定向到登录表单。我需要防止某些子路径(即不是全局)出现这种情况,而是在(否则)正常的Plone身份验证和授权发生后,返回403禁止,带有一个自定义(短)HTML页面 我研究了ITraversable,但是使用它在请求处理链中发生得太早了——比如在身份验证之前等等 一种可能的尚未开发的方法是将自定义视图注入URL路径,该路径对映射到剩余子路径的对象执行身份验证检查。所以可能有一个URL类似于http://myplone/somepath/customvi

在未经授权的访问时,Plone默认情况下会重定向到登录表单。我需要防止某些子路径(即不是全局)出现这种情况,而是在(否则)正常的Plone身份验证和授权发生后,返回403禁止,带有一个自定义(短)HTML页面

我研究了ITraversable,但是使用它在请求处理链中发生得太早了——比如在身份验证之前等等

一种可能的尚未开发的方法是将自定义视图注入URL路径,该路径对映射到剩余子路径的对象执行身份验证检查。所以可能有一个URL类似于
http://myplone/somepath/customview/withcustom403
,其中:

  • customview
    视图实现了
    ippublishtraverse
    ,其
    publishTraverse()
    返回自身
  • 然后,相同的视图在其
    \uuuu call\uuuu
    方法中验证使用Custom403对象访问
    ,即通过调用
    getSecurityManager().validate()
  • 如果验证失败,视图将响应设置为403并返回自定义HTML
  • 这样行吗?或者在进行身份验证之后,但在Plone调用
    response.Unauthorized()
    (触发重定向)之前,是否会触发一些事件,从而提供更干净的解决方案


    这适用于当前的Plone 4.3.4。

    您可以覆盖
    产品/CMFPlone/skins/Plone\u login/require\u login.py
    ,并在其中添加任何逻辑以提供自定义响应


    或者完全绕过
    require\u login
    ,使用自己的浏览器视图来处理此问题。在您的Plone站点中,进入
    acl\u用户/凭证\u cookie\u身份验证/管理\u属性表单
    ,对于登录表单属性,使用浏览器视图名称替换
    require\u登录

    您可以基于acl\u用户/凭证\u cookie\u身份验证插件创建一个新的PAS质询插件,并确保将其移动到质询的顶部acl_用户中的插件

    或者使用猴子补丁来更改当前的插件。仅出于演示目的,您可以编辑
    产品/PluggableAuthService/plugins/CookieAuthHelper.py
    。在
    unauthorized
    方法中,您将看到以下行:

    url = '%s%scame_from=%s' % (url, sep, quote(came_from))
    resp.redirect(url, lock=1)
    
    在这些行之前,添加两行以防止未经授权访问其url中包含
    nogo
    的任何资源:

    if 'nogo' in came_from:
        return 1
    

    如果您创建了自己的插件,请检查
    产品/PlonePAS/Extensions/Install.py中的
    setupAuthPlugins
    功能,了解如果您不想手动安装插件的方法。

    谢谢您的建议。然而,此时似乎已经发生了重定向?是的。让我用另一个答案提出另一种方法。相关:顺便说一句,现在有一个PAS插件,如果UA是浏览器,它只重定向到登录表单: