我有一个简单的根资源工厂:
class Root:
__acl__ = [
(Allow, Authenticated, 'edit')
]
Run Code Online (Sandbox Code Playgroud)
现在对于一些"特殊"路线,我需要创建另一个资源工厂
config.add_route('special', '/special/test', factory=SpecialFactory)
class SpecialFactory:
__acl__ = [
(Allow, Authenticated, 'special_edit')
]
Run Code Online (Sandbox Code Playgroud)
现在,我想做Root父母SpecialFactory- 我该怎么做?
这是正确的方式......
class SpecialFactory:
def __init__(self, request):
self.request = request
self.__parent__ = Root(request)
self.__name__ = 'special'
__acl__ = [
(Allow, Authenticated, 'special_edit')
]
Run Code Online (Sandbox Code Playgroud)
我也完全不了解它的目的__name__和应该设置的目的.
此外,什么时候金字塔会遍历__parent__链条而不是?对于这样的视图配置:
@view_config(route_name='special', permission='special_edit')
def something(req):
pass
Run Code Online (Sandbox Code Playgroud)
金字塔会'收集'两个权限(special_edit和edit)还是只有一个(special_edit)?
请详细说明计算权限的"流程".
Mic*_*kel 12
__name__ 只有在通过遍历生成网址时才考虑到这一点,所以不要担心它.
首先,工厂的论点是工厂.意思是,它是接受request对象的"某个对象" ,并期望接收一个实际上是树的根的对象.
class Root:
def __init__(self, request):
self.request = request
def resource_factory(request):
return Root(request)
add_route(..., factory=resource_factory)
Run Code Online (Sandbox Code Playgroud)
请注意,这里的工厂是显而易见的.常用的快捷方式是使用构造对象实例实际返回自身的事实.因此Root(request)从外部看起来完全相同并返回相同的对象resource_factory(request).
好的,所以现在我们有一个"根"对象,我们可以从中开始遍历.当然,这不一定是树的实际根,它只是遍历的起点.
你还没有traverse为你添加一个参数add_route,所以遍历不会去任何地方,它只会将根对象作为上下文返回.查找上下文对象是遍历练习的整个目标.
所以,现在我们有了一个背景.好极了.
金字塔的授权通过将用户的"有效主体"与"上下文"和"许可"相结合来工作.这三件事是您的授权策略将用于确定是允许还是拒绝操作的内容.
"有效主体"来自身份验证策略,代表请求后面的用户.
"上下文"和"许可"是您想要的任何内容.在大多数情况下,它们都是request.context视图的权限,但pyramid.security.has_permission()可以接受任何上下文对象和任何权限,并返回允许或拒绝结果.
所以,我们已经获得了3项授权所需的东西.现在,如何授权?那取决于授权政策.默认情况下ACLAuthorizationPolicy.那么它是怎样工作的?
从那个ACLAuthorizationPolicy开始,context然后向后穿过那个对象的"血统"."沿袭"被定义为通过跟随每个对象__parent__返回到末尾而创建的列表,其中没有更多__parent__要遵循的内容.因此在您的示例中,上下文将是一个实例SpecialFactory,并且上下文的"沿袭"是列表[ SpecialFactory(request), Root(request) ].
ACL匹配的工作方式(在ACLAuthorizationPolicy)中,它遍历从上下文回到根的沿袭中的每个对象__acl__,按顺序搜索每个对象.它找到的第一场比赛是胜利者.在ACL中的条目由定义"(Allow或者Deny,principal,permission)"和匹配是在包含我们正在寻找相同的权限访问控制列表中的条目,作为主要匹配的负责人之一在我们的有效校长的名单当前用户.找到匹配后,搜索停止并返回结果.
如果此算法不适合您,请替换授权策略.它是高度可插拔的,默认实现很容易理解(总共只有几行代码).您甚至可以制定自己的策略,根本不关心上下文,此时您可以忽略所有这些遍历的废话.由你决定.
| 归档时间: |
|
| 查看次数: |
1445 次 |
| 最近记录: |