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