在我的禁止视图中,如果他们访问访客页面,我想将所有成员重定向到他们的仪表板,如果他们访问成员页面,我想将所有访客重定向到登录页面。这很容易。
但是,在某些情况下,我需要抛出HTTPForbidden错误,这不是导致权限失败的原因,只是向用户显示原因。如何确定HTTPForbidden是否是权限失败或其他原因的结果?我想我可以用pyramid.security.has_permission
做一些奇怪的事情(尚未尝试过),但必须有一种更简单的方法。
2011年的一个老问题,据说这是在待办事项清单How to check what permission failed in authorization in pyramid (pylons 2)?
答案 0 :(得分:2)
我还没有对它进行过测试,但我尝试做的是在手动执行此操作的地方提高HTTPForbidden
以外的其他内容。你甚至可以继承HTTPForbidden
:
class WeDontLikeYourFace(HTTPForbidden):
pass
def my_view(context, request):
if request['face'] != 'beautyful':
raise WeDontLikeYourFace("go away")
然后,您可以为自定义异常注册自定义视图,或者在为HTTPForbidden注册的公共视图方法中执行一些if / else操作。
您还可以向子类添加自定义字段,以传递您需要的任何信息。
答案 1 :(得分:2)
这不是你要求的,但它可能仍然对你有所帮助。
已经给出了对您的问题的正确答案:您最好提出一个比HTTPForbidden
更合适的特定异常。
但是,如果您确实想要根据触发HTTPForbidden
异常的缺失权限更改禁止视图的行为,则需要获取其名称。
可以在HTTPForbidden
中的HTTPForbidden.result.permission
例外对象中找到缺失权限的名称。
但首先,HTTPForbidden
异常需要作为禁止视图的上下文传递。
例如,以下是我在我的webapps中如何使用它来告知用户他为什么无法访问特定功能以便他可以 如果合适,请经理相应地重新配置ACL。
@forbidden_view_config(renderer='/forbidden.mako')
def forbidden(context, request):
return { 'required_permission': context.result.permission }
它适用于金字塔1.4。 我在文档中找不到任何内容,所以我通过调试金字塔来攻击它。 这是一个解决方法,而不是一个干净的解决方案。