如何在金字塔中获得附加到被调用视图的权限?

时间:2012-09-19 23:04:49

标签: python pylons pyramid

在我的禁止视图中,如果他们访问访客页面,我想将所有成员重定向到他们的仪表板,如果他们访问成员页面,我想将所有访客重定向到登录页面。这很容易。

但是,在某些情况下,我需要抛出HTTPForbidden错误,这不是导致权限失败的原因,只是向用户显示原因。如何确定HTTPForbidden是否是权限失败或其他原因的结果?我想我可以用pyramid.security.has_permission做一些奇怪的事情(尚未尝试过),但必须有一种更简单的方法。

2011年的一个老问题,据说这是在待办事项清单How to check what permission failed in authorization in pyramid (pylons 2)?

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。 我在文档中找不到任何内容,所以我通过调试金字塔来攻击它。 这是一个解决方法,而不是一个干净的解决方案。