1

私はドキュメンテーションに従っていますGroup-Level Security
はこれらを書きます:

def groupfinder(userid, request):
    print '#'*80
    print userid
    role = DBSession.query(Role)....

    if role.name == "Admin":
        return ['g:admin']


class RootFactory(object):
        __acl__ = [
            (Allow, Everyone, 'view'),
            (Allow, Authenticated, 'edit'),
            (Allow, 'g:admin', 'admin')
        ]

        def __init__(self, request):
            pass


authn_policy = AuthTktAuthenticationPolicy(
    settings['auth.secret'],
    callback=groupfinder,
)

それは機能しましたが、ロードされたすべてのページがDBに繰り返しクエリを実行し、
ユーザーがログインしたときに最初に許可を返すだけですか?
それとも私のやり方が間違っているのでしょうか...

また、mako のようなテンプレートで許可「g:admin」を知るにはどうすればよいですか?

4

1 に答える 1

6

groupfinder現在、微妙なバグがあります。ユーザーが有効な場合、常にリストを返す必要があります。ユーザーがいない場合にのみ、 を返す必要がありますNone。現在、ユーザーが管理者である場合にのみリストを返すため、通常のユーザーは認識されません。

def groupfinder(userid, request):
    print '#'*80
    print userid
    role = DBSession.query(Role)....

    if role is not None:
        principals = []
        if role.name == "Admin":
            principals.append('g:admin')
        return principals

でない限り、常にリストを返す方法に注意してroleくださいNone

次に、あなたはパフォーマンスについて尋ねました。Pyramid は何もキャッシュしようとしません。ただし、これは自分で簡単に処理できます。これを行う一般的な方法は、またはrequestを含むオブジェクトにキャッシュされた (具体化された) プロパティを追加することです。そうすれば、 が呼び出されるたびに、再度クエリを実行する代わりに、キャッシュされたものを使用できます。このパターンはここに示されています。roleusergroupfinderrole

mako のようなテンプレートで権限「g:admin」を知るにはどうすればよいですか

'g:admin' は、実際には Pyramid の認証用語のプリンシパルです。「admin」(アクセス制御エントリの 3 番目の要素) は権限です。プリンシパルは、物事をパーミッションにマッピングするのに役立つ実装の詳細として扱われます。最終的には、アクセス/承認を処理するときに本当に気にするのはパーミッションだけです。

ユーザーがテンプレートでその権限を持っているかどうかを確認するには、pyramid.security.has_permission('admin', request.context, request). その上にrequest.contextあるオブジェクトと置き換えることができますが、このシナリオではあなたのものになります(これはあなたが望むものです)。__acl__request.contextRootFactory

于 2013-01-24T08:10:14.027 に答える