2016-11-17 41 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中更改ID) 或者我需要做額外的檢查,就像我使用裝飾器has_ownership

是否有任何其他替代方案來實現web2py中的對象級訪問控制?我不想使用CRUD。

謝謝

回答

1

因爲query已限制該組由電網與用戶有權訪問顯示的記錄,對電網的數字簽名的URL(這是默認啓用)足以防止訪問任何其他記錄。不僅會改變URL中的記錄ID,而且如果用戶試圖篡改編輯表單中隱藏的「id」表單域,表單提交將被拒絕。所以,不需要檢查has_ownership。另一方面,當所有的lambda函數都調用帶有相同參數傳遞給lambda的單個函數時(在本例中沒有參數),不需要lambda表達式。所以,裝飾器可以簡化爲@auth.requires(has_ownership)(當然,在這種情況下你並不需要裝飾器)。

+0

謝謝@Anthony。它幫助! –