2016-11-17 8 views
0

オブジェクトレベルのアクセス制御を追加します。 (ダミー学生の通知スキーマでそれを説明する)どのように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を使いたくない。

はあなたが

答えて

1

queryはすでにこれらのユーザーがアクセスを許可されていると、グリッドで表示されるレコードのセットを制限しているので、(デフォルトで有効になっている)、グリッドのデジタル署名されたURLを予防するのに十分であるありがとう他のレコードへのアクセスURLのレコードIDの変更は拒否されるだけでなく、ユーザーが編集フォームの隠し「id」フォームフィールドを改ざんしようとすると、フォームの提出は拒否されます。したがって、has_ownershipチェックの必要はありません。

ラムダがすべて同じ関数を呼び出すときにラムダに渡す必要はありません。同じ引数をラムダに渡します(この場合は引数なし)。したがって、デコレータは@auth.requires(has_ownership)に簡略化できます(もちろん、この場合はデコレータは実際には必要ありません)。

+0

ありがとう@Anthony。それは助けになった! –

関連する問題