オブジェクトレベルのアクセス制御を追加します。 (ダミー学生の通知スキーマでそれを説明する)どのようにweb2pyでオブジェクト/レコードレベルのアクセス制御を達成するには?
学生は、学生が同じクラス(標準)との通知のような割り当てられた主題を持っている場合にのみ告知(ニュース)(編集/表示)にアクセスする必要があります。 二つの役割/グループがあります - 「学生」と '先生
データベース・スキーマ:
# model db.py
auth.define_tables(username=False, signature=True)
db.define_table('class', Field('name'))
db.define_table('subject', Field('name'))
db.define_table('notice', Field('title'),
Field('class', db.class),
Field('subject', db.subject))
db.define_table('user_class', Field('user', db.auth_user),
Field('class', db.class))
db.define_table('user_subject', Field('user', db.auth_user),
Field('subject', db.subject))
-
#controller default.py
def has_ownership():
# Check if logged in user has class and subject to view/edit this notice
pass
@auth.requires_login()
@auth.requires(lambda: has_ownership())
def notice():
user_classes = db(db.user_class.auth_user == auth.user.id).select()
user_class_list = [clss['id'] for clss in user_classes]
user_subjects = db(db.user_subject.auth_user == auth.user.id).select()
user_subject_list = [subject['id'] for subject in user_subjects]
query = db.notice.class.belongs(user_class_list) & db.notice.subject.belongs(user_subject_list)
grid = SQLFORM.grid(query, user_signature=True)
return dict(grid=grid)
は、すべてのURLがデジタル署名されており、また、私は内のレコードを示していますユーザの主題およびクラスごとのグリッド。
私の質問は、デジタル署名されたURLのみで、他のレコードへのアクセスを制限するのに十分ですか? (URL内のIDを変更することによって) または、私はデコレータを使用したように余分なチェックを行う必要がありますhas_ownership
?
web2pyでオブジェクトレベルのアクセス制御を実現する他の方法はありますか?私はCRUDを使いたくない。
はあなたが
ありがとう@Anthony。それは助けになった! –