Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于记录属性的金字塔安全_Python_Pyramid - Fatal编程技术网

Python 基于记录属性的金字塔安全

Python 基于记录属性的金字塔安全,python,pyramid,Python,Pyramid,我在DB中有表,具有相同的查看界面,并使用Pyramid应用程序编辑它们。例如: from sqlalchemy.orm import relationship, backref from pyramid.security import Everyone, Allow class Report(Base): # ... user_id = Column(Integer, ForeignKey('user.id')) # ... @property d

我在DB中有表,具有相同的查看界面,并使用Pyramid应用程序编辑它们。例如:

from sqlalchemy.orm import relationship, backref
from pyramid.security import Everyone, Allow

class Report(Base):
    # ...
    user_id = Column(Integer, ForeignKey('user.id'))
    # ...


    @property
    def __acl__(self):
        return [
            (Allow, Everyone, 'view'),
            (Allow, self.user_id, 'edit'),
        ]

    # this also works:
    #__acl__ = [
    #    (Allow, Everyone, 'view'),
    #    (Allow, self.user_id, 'edit'),
    #]

class User(Base):
    # ...
    reports = relationship('Report', backref='user')
报告
表格查看记录的路径示例:
/birdreport/report/871

报告
表格编辑记录的路径示例:
/birdreport/report/871/edit

报告
表的每条记录都有一个字段,其中包含
用户id
——该值与通过身份验证的用户id函数返回的值相同。我很清楚如何通过添加查看权限来禁用对
编辑的访问。但是我如何才能仅为那些userid显示在相应记录中的用户启用对
编辑
视图的访问呢?

您可以通过在
报告中定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。例如:

from sqlalchemy.orm import relationship, backref
from pyramid.security import Everyone, Allow

class Report(Base):
    # ...
    user_id = Column(Integer, ForeignKey('user.id'))
    # ...


    @property
    def __acl__(self):
        return [
            (Allow, Everyone, 'view'),
            (Allow, self.user_id, 'edit'),
        ]

    # this also works:
    #__acl__ = [
    #    (Allow, Everyone, 'view'),
    #    (Allow, self.user_id, 'edit'),
    #]

class User(Base):
    # ...
    reports = relationship('Report', backref='user')
上面的
\uuu acl\uuu()
将允许所有人调用您的视图
视图
,但只有与
报告
相关的用户才能对其进行编辑


您可能尚未启用身份验证策略或授权策略,请引用以下内容:

使用Configurator的set_authorization_policy()方法启用授权策略

您还必须启用身份验证策略才能启用授权策略。这是因为授权通常取决于身份验证。在应用程序安装过程中,使用set_authentication_policy()和方法指定身份验证策略

上述配置启用了一个策略,该策略将在请求的环境中传递的“身份验证票证”cookie的值与在试图调用某个视图时在资源树中找到的任何ACL中存在的主体进行比较,该请求的环境包含对单个主体的引用

虽然可以混合和匹配不同的身份验证和授权策略,但使用身份验证策略但不使用授权策略配置金字塔应用程序是错误的,反之亦然。如果您这样做,您将在应用程序启动时收到一个错误


可能有必要将路由配置添加到问题中,因为这种情况下的行为取决于您是使用
url dispatch
还是
traversal
。谢谢您的回答。我已经用MichaelMerickel提出的方法解决了我的问题。