0

我想公开一个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

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

4

1 回答 1

3

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

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

Pyramid 提供了一种通过 effective_principals 谓词作弊的小方法,如果这些实际上是您想要区分的主体。同样,您必须确保它们是互斥的,否则您将不知道将调用哪个视图。

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

如果管理员也有 'user' 主体,那么您会将 '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)
于 2013-08-08T15:13:35.650 回答