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

how to generate custom 403 HTTP responses in Plone (prevent redirect)

未经授权的访问,Plone 默认提供登录表单的重定向。我需要为某些子路径(即不是全局)防止这种情况,而是 return 403 Forbidden,在(否则)正常的 Plone 身份验证和授权之后,使用自定义(短)HTML 页面地点。

我查看了 ITraversable,但在请求处理链中使用它的时间过早 - 即。在授权等之前

一种可能但尚未探索的方法是将自定义视图注入到 URL 路径,该路径对映射到剩余子路径的对象执行身份验证检查。所以可能会有一个带有 URL 的请求,比如 http://myplone/somepath/customview/withcustom403,其中:

  1. customview 视图实现 IPublishTraverse,它的 publishTraverse() return 本身
  2. 同一个视图接下来在其 __call__ 方法中验证对 withcustom403 对象的访问,即。通过调用 getSecurityManager().validate()
  3. 如果验证失败,视图将响应设置为 403 并且 returns 自定义 HTML

这行得通吗?或者是否有一些事件在 auth 发生之后触发,但在 Plone 调用 response.Unauthorized()(触发重定向)之前,这将提供一个更清晰的解决方案?

这是针对当前的 Plone 4.3.4。

您可以覆盖 Products/CMFPlone/skins/plone_login/require_login.py 并添加您想要的任何逻辑以提供自定义响应。

或完全绕过 require_login 并使用自己的浏览器视图来处理此问题。在您的 Plone 站点中,转到 acl_users/credentials_cookie_auth/manage_propertiesForm 并在登录表单 属性 中将 require_login 替换为您的浏览器视图名称。

您可以在 acl_users/credentials_cookie_auth 插件的基础上创建一个新的 PAS 挑战插件,并确保将其移至 acl_users 中挑战插件的顶部。

或者使用猴子补丁来更改当前插件。仅出于演示目的,您可以编辑 Products/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

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