この説明では、SQLAlchemy を使用して DB とやり取りしていると仮定します。
にある場合はconfig.add_route('pages', '/pages/{id}')
、カスタム ファクトリ__init__.py
を追加して、デフォルトの ACL を置き換え/補足することができます。例えば:
現在の ACL は次のようになります。
class RootFactory(object):
__acl__ = [
(Allow, Everyone, 'view'),
(Allow, Authenticated, 'auth'),
]
def __init__(self, request):
self.request = request
これにより、認証されたユーザーは「auth」の権限ですべてのビューにアクセスでき、サイトにアクセスするすべてのユーザーは「view」の権限ですべてのビューにアクセスできます。
カスタム factoryを使用することで、RootFactory をバイパスするか、補足することができます。
をバイパスするには、元の config.add_route を --> に変更し、config.add_route('pages', '/pages/{id}', factory=PageFactory)
次のような PageFactory クラスを作成します。
class PageFactory(object):
__acl__ = [
(Allow, Everyone, 'view'),
(Allow, Authenticated, 'auth'),
]
def __init__(self, request):
self.request = request
from pyramid.security import authenticated_userid
user_id = authenticated_userid(self.request)
thispage = DBSession.query(Page).filter(Page.id==self.request.matchdict['id']).first()
if thispage.user_id == user_id:
## Pyramid allows Everyone, Authenticated, and authenticated_userid
## (each of these is known as a Principal) to be in the second
## position of the ACL tuple
acl.append((Allow, user_id, 'edit'))
これは、ビューがpermission='edit'
そのパラメーターの 1 つとして持っていることを前提としています。
ここで、RootFactory を使用してカスタム ファクトリで補足したい場合は、同じことを繰り返す必要がありません。この投稿の冒頭で示したように、単に RootFactory のままにして、RootFactory クラスから継承します。 、 そのような:
class PageFactory(RootFactory):
@property
def __acl__(self):
acl = super(PageFactory, self).__acl__[:] ##[:] creates a copy
from pyramid.security import authenticated_userid
user_id = authenticated_userid(self.request)
thispage = DBSession.query(Page).filter(Page.id==self.request.matchdict['id']).first()
if thispage.user_id == user_id:
acl.append((Allow, user_id, 'edit'))
return acl
ちなみに、グループファインダーは非常に便利です。ユーザーを「admin」などのグループに配置するだけで、admin グループ内のすべてのユーザーがビューにアクセスできるpermission='whatever'
ためpermission='whateverelse'
、ファクトリは必要なく、現在のユーザーのグループリストを返す groupfinder。残念ながら、それはあなたがしようとしていたことではないので、脱線します。これがあなたの質問に答えることを願っています。