2016-11-17 12 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-адресе) Или мне нужно сделать дополнительную проверку, как я сделал с помощью декоратора has_ownership?

Есть ли другая альтернатива для достижения контроля доступа на уровне объекта в web2py? Я не хочу использовать CRUD.

Спасибо

ответ

1

Поскольку query уже ограничивает набор записей, отображаемых в сетке для тех, пользователь имеет право доступа, с цифровой подписью URL-сетки (которые включены по умолчанию) достаточно, чтобы предотвратить доступ к любым другим записям. Отклонить не только изменения идентификатора записи в URL-адресе, но если пользователь попытается вмешаться в скрытое поле формы «id» в форме редактирования, представление формы будет отклонено. Таким образом, нет необходимости в проверке has_ownership.

В стороне, нет необходимости в лямбда, когда вся эта лямбда является вызовом одной функции с теми же аргументами, которые передаются лямбда (в данном случае без аргументов). Таким образом, декоратор может быть упрощен до @auth.requires(has_ownership) (конечно, на самом деле вам не нужен декоратор в этом случае).

+0

Спасибо @ Энтони. Это помогло! –

 Смежные вопросы

  • Нет связанных вопросов^_^