Laden...

Architektur mit Hirarchie und Berechtigung

Erstellt von kleinrechner vor 3 Jahren Letzter Beitrag vor 3 Jahren 468 Views
K
kleinrechner Themenstarter:in
16 Beiträge seit 2018
vor 3 Jahren
Architektur mit Hirarchie und Berechtigung

Hallo,
habe versucht die aktuelle Struktur graphisch darzustellen. Sieht auf den ersten Blick nach einer ganz normalen Standard-Struktur aus. Die Elemente sind jeweis mit einer 1:n-Verbindung verknüpft.

  • .net Framework 4.8
  • EntityFramework 6.1

Der angemeldete Benutzer ist auf 0-n Kostenstellen berechtigt, die Checklisten sind mit der Kostenstelle verknüpft. Wenn in ICategory GetAll aufgerufen wird, sollen natürlich nur die Kategorien zurückgegeben werden, auf die der Benutzer berechtigt ist. Ich habe das aktuell so gelöst, dass der "Parent"-Service eine Liste aller Ids, auf die der Benutzer berechtigt ist, zurückgibt und in GetAll() die verwendet werden.


            var availableIds = _checklistService.GetAllIds();
            return _repository.GetAll().Where(x => availableIds.Contains(x.ChecklistId));

Das funktioniert zwar soweit, ich bin mir allerdings nicht sicher, ob das so elegant ist bzw von der performance her Probleme geben könnte. Gibt es hier ein BestPractice?

In diesem Fall muss ich in der Klasse der CategoryService-Klasse das IChecklistService injecten, allerdings möchte ich auch in der ChecklistService-Klasse die ICategoryService injecten, um z.B. alle Kategorien zu löschen, wenn die Checkliste gelöscht wird. Das geht natürlich nicht, weil hier eine Kreisabhängigkeit besteht. Wie würde man das am besten auflösen?

Vielen Dank
Chris

16.807 Beiträge seit 2008
vor 3 Jahren

Das funktioniert zwar soweit, ich bin mir allerdings nicht sicher, ob das so elegant ist bzw von der performance her Probleme geben könnte.

Weil Du auch im anderen Thema von Performance sprichst: Dich kostet es vermutlich viel mehr Performance, dass Du noch EF 6.1 verwendest und nicht EF Core.
Die Performance-Faktoren für viele Dinge sind oft im dreistelligen Bereich.

Daher ja gut, dass Du Dir um Performance Gedanken machst: gewichte es aber richtig.

Gibt es hier ein BestPractice?

Sind Berechtigungen Teil der Relationen, dann musst Du das in dieser Form eigentlich auch in der Datenbankstruktur darstellen; ansonsten kannst Du das nicht in einem Query darstellen und musst immer von Außen prüfen.

Von Außen prüfen macht man aber anders; die Art und Weise nennt sich Resource-based Authorization; also Authorisierung auf Resourcen-Ebene.
Dazu gibts tausende von Implemementierungsmöglichkeiten, egal ob in Sprachebene (Java, JavaScript, .NET) oder auf Infrastruktur-Ebene (API Management, Kubernetes, OPA).

In .NET gibts dazu ebenfalls eine Implementierung, die zusammen mit ASP.NET Core entstanden ist - aber in jeder anderen App-Art in .NET angewandt werden kann.
Die Authorisierung ist hierbei aber eine eigene Logik-Implementierung, auf die andere Service zugreifen dürfen - aber nicht Repositories (weil sonst Schichtverletzung)

K
kleinrechner Themenstarter:in
16 Beiträge seit 2018
vor 3 Jahren

Hallo,
die Berechtigung sollte über die Datenstruktur möglich sein, ich werde mir aber Resource-based Authorization nochmal genauer anschauen, danke für den Hinweis.

Leider ist es mir aktuell nicht möglich auf .net Core/EF Core umzusteigen, auch wenn ich das sehr gerne tun würde.

cu
Chris