2016-11-17 1 views
0

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

Antwort

1

Da die query bereits die Datensätze durch das Gitter zu denen der Benutzer angezeigt schränkt den Zugriff autorisiert, die digital signierte URLs des Gitters (die standardmäßig aktiviert sind) sind ausreichend, um zu verhindern, Zugriff auf andere Datensätze. Nicht nur werden Änderungen an der Datensatz-ID in der URL zurückgewiesen, sondern wenn der Benutzer versucht, das versteckte "ID" -Formularfeld im Bearbeitungsformular zu manipulieren, wird die Formularübermittlung zurückgewiesen. Also, keine Notwendigkeit für die has_ownership Prüfung.

Nebenbei, es gibt keine Notwendigkeit für ein Lambda, wenn alle Lambda ist eine einzige Funktion mit den gleichen Argumente an das Lambda übergeben (in diesem Fall keine Argumente) aufrufen. So könnte der Decorator auf @auth.requires(has_ownership) vereinfacht werden (natürlich brauchen Sie in diesem Fall den Decorator nicht).

+0

Dank @Anthony. Es half ! –