使用权限创建同一路由的不同视图

时间:2013-08-08 11:35:06

标签: pyramid

我希望公开REST服务并使用权限上下文来调用不同的方法(简单用户与管理员用户)。

我做了什么(简单示例):

config.add_route('rest', '/url')
....
@view_config(route_name="rest", renderer="json", request_method='GET', permission='user')
def firstMethod(request):
    ...
@view_config(route_name="rest", renderer="json", request_method='GET', permission='admin')
def secondMethod(request):
    ...

但是当我开始金字塔时出现以下错误:

  

“ConfigurationConflictError:冲突的配置操作”

代表firstMethodsecondMethod

有什么想法可以解决我的问题吗? (我知道我可以使用委托人,但我需要使用权限,而不是委托人......)

1 个答案:

答案 0 :(得分:2)

您的权限标记为主体,而不是权限,因此您可能需要考虑如何实际使用权限。校长更像是特征(组),而权限就像动词(用户做什么)。

正如Martijn所说,ACL模型的工作方式在一般意义上很难推断一个权限是否与另一个权限相互排斥以获得任意权限。例如,“管理员”用户不是“用户”用户吗?我想这取决于你。

Pyramid通过effective_principals谓词提供了一种很小的欺骗手段,如果这些是你想要区分的主要内容。您必须再次确保它们是互斥的,否则您将不知道将调用哪个视图。

@view_config(route_name='foo', effective_principals=['admin'])

如果管理员也拥有'用户'主体,那么你将'user'从下一个view_config中删除,如下:

@view_config(route_name='foo')

现在它毫不含糊。

在其他情况下使这个明确无误的方法是使用您自己的视图谓词。

@view_config(route_name='foo', is_admin=True)
@view_config(route_name='foo', effective_principals=[Authenticated])

config.add_view_predicate('is_admin', AdminPredicate)
相关问题