はっきりいって、
http://www.tipfy.org/docs/api/tipfy.ext.acl.html
http://www.tipfy.org/wiki/extensions/acl/
の2カ所以外に資料はみつからない。あとは、ソースを読み解け、ということだと思う。
間違えているかもしれないが、現状思っていることを記録しておく。
[area]
webアプリケーションで範囲を設定して、それごとにaclを設定できるということのようだ。なぜなら、
user_acl = AclRules.get_by_area_and_user('my_area', 'user_2')
としてaclを取得してから、その役割に追加したり、調べたりできるようだからだ。
ここが分かりずらかった。大規模になったときには便利になるんだろう。
[rule]
# Set a dict of roles with an 'admin' role that has full access and
# assign users to it. Each role maps to a list of rules. Each rule is a
# tuple (topic, name, flag), where flag is as bool to allow or disallow
# access. Wildcard '*' can be used to match all topics and/or names.
とあるので、topic, name, flag によって構成されていることがわかる。
[role]
Groupではなく、roleと呼ぶみたいだ。
[roles_map]
Acl.roles_map = {
'admin': [
('*', '*', True),
],
}
roleとruleをタブルで列挙していく。
[使い方-ユーザーの追加]
# Assign users 'user_1' and 'user_2' to the 'admin' role.
AclRules.insert_or_update(area='my_area', user='user_1', roles=['admin'])
AclRules.insert_or_update(area='my_area', user='user_2', roles=['admin'])
[使い方-ユーザーに対する権限の追加/削除]
user_acl = AclRules.get_by_area_and_user('my_area', 'user_2')
user_acl.rules.append(('UserAdmin', '*', False))
user_acl.put()
area,userからAclRulesを取得して、そのrulesからappend()とかremove()すればよさそうだ。
[使い方-実装]
is_one(role)
is_any(roles)
is_all(roles)
has_any_access()
as_access(topic, name)
を使って実装していく。
[app-engine-site-creatorのACLの実装との比較について]
app-engine-site-creatorではACLの実装のかなりの部分をmodels.pyに記述している。
tipfyでもやり方によってはできるか?
[デコレータ]
Handlerを書くときにデコレータで
@login_required
@admin_required
のようにかけたら便利だな、と思っていたところ、
http://groups.google.com/group/tipfy/browse_thread/thread/cca740bf8e131510/c609e94e1e70fa96?lnk=gst&q=acl#c609e94e1e70fa96
に「書いたよ!」という人がいた。
一応、引用しておこう。
I wrote a function decorator for acl, it is according to my needs, but
maybe it is interesting for others too:
roles_map = {
# roles map definitions
}
# function decorator:
def require(name, topic, area='whole'):
def wrap(func):
@auth.user_required
def decorated(*args, **kwargs):
context = {}
# user info for the template, getAuth is a custom function
which
# returns username and the links generated by auth
#context['auth'] = getAuth()
#username = context['auth']['user'].username
username = auth.get_current_user().username
Acl.roles_map = roles_map
acl = Acl(area, username)
if acl.has_access(topic=topic, name=name):
return func(*args, **kwargs)
else:
context['errormessage'] = 'No access.'
return render_response('error.html', **context)
return decorated
return wrap
# a functional form instead of a decorator, which return True or False
instead of a response
@auth.user_required
def is_allowed(name, topic, area='whole'):
username = auth.get_current_user().username
Acl.roles_map = roles_map
acl = Acl(area, username)
return acl.has_access(topic=topic, name=name)
Is there a more appropriate place to publish snippets and samples for
tipfy?
/ruben
さて、そろそろ調査は終わりかな...
0 件のコメント:
コメントを投稿