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

时间:2015-03-04 09:20:57

标签: python plone

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

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

一种可能尚未探索的方法是将自定义视图注入URL路径,该路径对映射到其余子路径的对象执行auth检查。因此,可能会有一个URL请求http://myplone/somepath/customview/withcustom403,其中:

  1. customview视图实现IPublishTraverse,其publishTraverse()自行返回
  2. 然后,相同的视图在其__call__方法中验证对withcustom403对象的访问权限,即。致电getSecurityManager().validate()
  3. 如果验证失败,视图会将响应设置为403并返回自定义HTML
  4. 这会有用吗?或者在auth发生后是否触发了一些事件,但是在Plone调用response.Unauthorized()(触发重定向)之前,这将提供更清晰的解决方案?

    这是针对当前的Plone 4.3.4。

2 个答案:

答案 0 :(得分:2)

您可以根据acl_users / credentials_cookie_auth插件创建一个新的PAS Challenge插件,并确保将其移至acl_users中Challenge插件的顶部。

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

url = '%s%scame_from=%s' % (url, sep, quote(came_from))
resp.redirect(url, lock=1)

在这些行之前,添加两行以防止未经授权访问其网址中包含nogo的任何资源:

if 'nogo' in came_from:
    return 1

如果您创建自己的插件,请检查setupAuthPlugins中的Products/PlonePAS/Extensions/Install.py功能,以便在不想手动操作的情况下安装它。

答案 1 :(得分:0)

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

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