您可以通過在Report
模型中定義__acl__()
來使用Pyramid authorization policy。例如:
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')
上面的__acl__()
將讓每個人都打電話給你的看法view
,但只有用戶相關Report
到edit
它。
這可能是因爲你還沒有驗證策略或授權策略啓用,引述documentation:
使用配置的set_authorization_policy()方法來實現的授權策略。
您還必須啓用身份驗證策略才能啓用授權策略。這是因爲授權通常取決於認證。在應用程序設置過程中使用set_authentication_policy()和方法來指定身份驗證策略。
from pyramid.config import Configurator
from pyramid.authentication import AuthTktAuthenticationPolicy
from pyramid.authorization import ACLAuthorizationPolicy
authentication_policy = AuthTktAuthenticationPolicy('seekrit')
authorization_policy = ACLAuthorizationPolicy()
config = Configurator()
config.set_authentication_policy(authentication_policy)
config.set_authorization_policy(authorization_policy)
上述結構,能夠進行比較的「AUTH票」的值的策略的cookie在請求環境中傳遞它包含針對在發現存在於任何ACL校長一個單一的主要參考試圖調用某個視圖時的資源樹。
儘管可以混合和匹配不同的身份驗證和授權策略,但使用身份驗證策略配置金字塔應用程序時沒有授權策略,反之亦然,這是錯誤的。如果你這樣做,你會在應用程序啓動時收到一個錯誤。
可能有必要爲該問題添加路由配置,因爲這種情況下的行爲取決於您是使用'url dispatch'還是'traversal'。 –