Ich möchte Zugriffskontrolle auf Objektebene hinzufügen.Wie erreicht man Zugriffssteuerung auf Objekt-/Datensatzebene in web2py?
(mit Dummy-Schüler-Mitteilung Schema Erklären)
Schüler sollen die Bekanntmachung (Nachrichten) nur Zugriff (edit/view), wenn Schüler dieselbe Klasse (Standard) und unterliegen wie die Mitteilung zugeordnet sind. Es gibt zwei Rollen/Gruppen - 'Student' und 'Lehrer'
Datenbankschema:
# 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)
Alle Urls digital signiert sind und auch in Ich zeige Aufzeichnungen das Raster nach Thema und Klasse des Benutzers.
Also meine Frage ist nur digital signierte URLs sind genug, um den Benutzer vom Zugriff auf andere Datensätze zu beschränken? (durch Ändern der ID in der URL) Oder muss ich extra überprüfen, wie ich mit Dekorator has_ownership
getan habe?
Gibt es noch eine andere Alternative, um in web2py Zugriffssteuerung auf Objektebene zu erreichen? Ich möchte CRUD nicht verwenden.
Danke
Dank @Anthony. Es half ! –