3

Pyramid アプリでそれらを表示および編集するための同じインターフェイスを備えた DB にテーブルがあります。例えば:

reportテーブルのビュー レコードのルートの例: /birdreport/report/871;

reportテーブルの編集レコードのルートの例: /birdreport/report/871/edit;

reportテーブルの各レコードには、次を含むフィールドがありますuser_id。この値は、authenticated_userid 関数によって返される値と同じです。edit表示権限を追加してアクセスを無効にする方法は明らかです。editしかし、対応するレコードにユーザー ID が存在するユーザーに対してのみ表示へのアクセスを有効にするにはどうすればよいでしょうか?

4

1 に答える 1

7

モデル内で定義することにより、ピラミッド認証ポリシーを使用できます。例えば:__acl__()Report

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


ドキュメントを引用すると、認証ポリシーまたは承認ポリシーが有効になっていない可能性があります。

Configuratorの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)

上記の構成により、単一のプリンシパルへの参照を含むリクエストの環境で渡された「認証チケット」Cookieの値を、ビューを呼び出そうとしたときにリソースツリーで見つかったACLに存在するプリンシパルと比較するポリシーが有効になります。

さまざまな認証ポリシーと承認ポリシーを組み合わせて使用​​することは可能ですが、Pyramidアプリケーションを認証ポリシーを使用して構成し、承認ポリシーを使用しない場合、またはその逆を行う場合はエラーになります。これを行うと、アプリケーションの起動時にエラーが発生します。

于 2012-10-08T07:18:02.237 に答える