【问题标题】:how to generate custom 403 HTTP responses in Plone (prevent redirect)如何在 Plone 中生成自定义 403 HTTP 响应(防止重定向)
【发布时间】:2015-03-06 06:45:57
【问题描述】:

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

我研究了 ITraversable,但在请求处理链中使用它太早了 - 即。在身份验证等之前。

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

  1. customview 视图实现 IPublishTraverse,其 publishTraverse() 返回自身
  2. 下一个视图在其__call__ 方法中验证对withcustom403 对象的访问,即。致电getSecurityManager().validate()
  3. 如果验证失败,视图将响应设置为 403 并返回自定义 HTML

这行得通吗?还是在 auth 发生之后触发了某些事件,但在 Plone 调用 response.Unauthorized()(触发重定向)之前,这将提供更清洁的解决方案?

这适用于当前的 Plone 4.3.4。

【问题讨论】:

标签: python plone


【解决方案1】:

您可以基于 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 函数,如果您不想手动安装它。

【讨论】:

【解决方案2】:

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

或者完全绕过require_login 并使用自己的浏览器视图来处理这个问题。在您的 Plone Site 中,转到 acl_users/credentials_cookie_auth/manage_propertiesForm 并在 Login Form 属性中将 require_login 替换为您的浏览器视图名称。

【讨论】:

  • 感谢您的想法。但是,似乎此时重定向已经发生了?
  • 是的。让我在不同的答案中建议另一种方法。
猜你喜欢
  • 1970-01-01
  • 2020-01-14
  • 2016-10-06
  • 2010-09-14
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2015-11-12
相关资源
最近更新 更多