Data Access Layer - Wann sollten welche Daten geladen werden

SQLException

Newbie
Registriert
Juli 2019
Beiträge
2
Hallo zusammen,

ich bin neu hier und habe direkt mal eine Frage, die mich schon seit Tagen beschäftigt. Sicherlich gibt es nicht den einen richtigen Weg und deshalb finde ich nichts, was mir weiterhilft.

Ich arbeite zur Zeit an einer WPF-Andwedung. Die Daten sind in einer MS SQL Datenbank gesichert. Dazwischen hängt eine Web-API.
Das ist aber eigentlich alles nicht relevant. Kommen wir also jetzt zum Thema:

In der Datenbank gibt es Benutzer die mehrere Benutzerrollen haben können. Einer Benutzerrolle sind mehrere Rechte zugeordnet.

Jetzt frage ich mich, wann ich die Rechte der Benutzer aus der Datenbank laden soll.
Bei einem erfolgreichem Login werden Benutzerdaten aus der Datenbank geladen und in einem Benutzerobjekt gespeichert. Später soll geprüft werden auf welche Funktionen der Anwendung der Benutzer zugreifen darf.

Sollte ich im Benutzerobjekt dann direkt seine Rollen und Rechte speichern? Nachteil wäre, dass wenn ich einfach nur etwas über einen Nutzer wissen will, ich automatisch alle Benutzerrollen, die mich ggf. gar nicht interessieren mit lade. Und wenn ich eine Liste an Nutzern lade, die gleichen Rollen zugeordnet sind, würde ich die Rollen doppelt und dreifach laden.

Oder sollte ich eine Funktion schreiben, die nur dann die Rollen und Rechte abruft, wenn ich sie benötige? Nachteil wäre hier, dass ich wohl viel mehr Anfragen an die Web-API senden müsste.

Zur Info: die Sicherheit hat hier nicht die höchste Priorität, da serverseitig sowieso nochmal geprüft wird, ob der Nutzer die Funktion auch ausführen darf.

Würde mich sehr über ein paar Tips freuen!

Das war ja jetzt schon recht speziell. Man kann die Frage auch allgemeiner Stellen:
Wenn man Objekte aus der Datenbank laden will, die mit anderen Objekten verknüft sind. Sollte man dann zunächst nur das, was man benötigt aus der Datenbank laden oder Direkt das vollständige Objekt?
 
SQLException schrieb:
Wenn man Objekte aus der Datenbank laden will, die mit anderen Objekten verknüft sind. Sollte man dann zunächst nur das, was man benötigt aus der Datenbank laden oder Direkt das vollständige Objekt?

Die Frage kann man nicht pauschal beantwortet. Wenn die Rechte in Richtung "ist Admin ja/nein" sind, dann kann man das direkt mit laden. Wenn das ein komplexer RBAC Baum ist, dann sinnvollerweise eher nicht.

Dann kannst du dich noch fragen: "Wie teuer ist der API Aufruf, wenn ich die Rechte nachlade?", "Ist es eventuell gar teurer, wenn alles in einem Aufruf lade?"

Im besten Fall: Testen. Wenns läuft und performant ist: passt. Schau dir mal das Proxy-Pattern an.
 
Eigentlich musst du alles machen! Beim Laden (Einloggen) des Benutzers werden die Rollen übermittelt, die der Benutzer hat (für Steuerung der Anzeige etc.) beim Zugriff werden die Rollen des Benutzers geprüft, um festzustellen ob die Schnittstelle überhaupt zugreifbar ist. Und dann kann es beim Laden der Daten noch passieren, dass bestimmte Restriktionen für einen Benutzer/eine Rolle gelten, die wieder beachtet werden müssen.
Wenn du ein Frameworks nutzt, das solche Dinge handeln kann, wird das alles etwas einfacher.
 
@Bagbag @phm666
Vielen Dank für die schnelle Hilfe und die Tipps!

Ich habe es nun so gemacht, dass die Benutzerdaten direkt "komplett" aus der Datenbank geladen werden.
Da ist es noch recht simpel.

Bei den größeren Aufgaben werde ich mal die Ladezeiten checken und dann wahrscheinlich Daten erst dann nachladen, wenn sie benötigt werden.

Proxy-Pattern schaue ich mir mal an.
 
Zurück
Oben