Я хочу добавить контроль доступа на уровне объекта.Как достичь контроля доступа к уровню объекта/записи в 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.
Спасибо
Спасибо @ Энтони. Это помогло! –