2012-10-08 49 views
3

我在DB中具有相同界面的表格用於查看並使用Pyramid應用程序編輯它們。例如:基於記錄屬性的金字塔安全

查看記錄的路線示例report表格:/birdreport/report/871;

report編輯記錄路線示例表格:/birdreport/report/871/edit;

report表的每個記錄都有包含user_id的字段 - 該值與authenticated_userid函數返回的值相同。我很清楚如何通過添加查看權限來禁用對edit的訪問權限。但是,我如何才能使訪問edit視圖僅適用於那些在相應記錄中使用和呈現的用戶?

+0

可能有必要爲該問題添加路由配置,因爲這種情況下的行爲取決於您是使用'url dispatch'還是'traversal'。 –

回答

7

您可以通過在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,但只有用戶相關Reportedit它。


這可能是因爲你還沒有驗證策略或授權策略啓用,引述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校長一個單一的主要參考試圖調用某個視圖時的資源樹。

儘管可以混合和匹配不同的身份驗證和授權策略,但使用身份驗證策略配置金字塔應用程序時沒有授權策略,反之亦然,這是錯誤的。如果你這樣做,你會在應用程序啓動時收到一個錯誤。

+0

感謝您的回覆。我已經使用Michael Merickel提出的[Simple Object-Level Authorization](http://michael.merickel.org/projects/pyramid_auth_demo/group_security.html#simple-object-level-authorization)方法解決了我的問題。 – drnextgis