3

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

但是,在某些情况下,我需要抛出一个 HTTPForbidden 错误,这不是权限失败的原因,而是简单地向用户显示原因。如何确定 HTTPForbidden 是权限失败还是其他原因造成的?我想我可以用pyramid.security.has_permission(还没有尝试过)做一些奇怪的事情,但必须有一个更简单的方法。

2011 年的一个老问题,据说这是在待办事项列表中如何检查金字塔(塔 2)中授权失败的权限?

4

2 回答 2

3

这不完全是您所要求的,但它仍然可以帮助您。您的问题的正确答案已经给出:您最好提出一个比HTTPForbidden.

但是,如果您真的想根据触发异常的丢失权限来更改禁止视图的行为,则HTTPForbidden需要获取其名称。缺失权限的名称可以HTTPForbiddenHTTPForbidden.result.permission. 但首先,HTTPForbidden需要将异常作为禁止视图的上下文传递。

例如,这是我如何在我的 web 应用程序中使用它来通知用户为什么他无法访问特定功能,以便他可以要求管理员在适当的情况下相应地重新配置 ACL。

@forbidden_view_config(renderer='/forbidden.mako')
def forbidden(context, request):
    return { 'required_permission': context.result.permission }

它适用于金字塔 1.4。我在文档中找不到任何东西,所以我通过调试金字塔来破解它。这更像是一种解决方法,而不是一个干净的解决方案。

于 2013-01-11T17:47:25.683 回答
2

我没有测试过它,但我想做的是HTTPForbidden在你手动执行此操作的地方提出其他内容。你甚至可以子类化HTTPForbidden

class WeDontLikeYourFace(HTTPForbidden):
    pass

def my_view(context, request):
    if request['face'] != 'beautyful':
        raise WeDontLikeYourFace("go away")

然后你可以为你的自定义异常注册一个自定义视图,或者在为 HTTPForbidden 注册的通用视图方法中做一些 if/else 的事情。

您还可以将自定义字段添加到您的子类以传递您需要的任何信息。

于 2012-09-20T00:26:03.827 回答