未经授权的访问,Plone默认提供重定向到登录表单。我需要为某些子路径(即不是全局)阻止这种情况,而是在(否则)正常的Plone身份验证&之后返回403 Forbidden,使用自定义(短)HTML页面。授权已经发生。
我研究了ITraversable,但是在请求处理链中使用它太早了 - 即。在认证等之前。
一种可能尚未探索的方法是将自定义视图注入URL路径,该路径对映射到其余子路径的对象执行auth检查。因此,可能会有一个URL请求http://myplone/somepath/customview/withcustom403
,其中:
customview
视图实现IPublishTraverse
,其publishTraverse()
自行返回__call__
方法中验证对withcustom403
对象的访问权限,即。致电getSecurityManager().validate()
这会有用吗?或者在auth发生后是否触发了一些事件,但是在Plone调用response.Unauthorized()
(触发重定向)之前,这将提供更清晰的解决方案?
这是针对当前的Plone 4.3.4。
答案 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
替换为您的浏览器视图名称。