Entwickler-Ecke

WinForms - Abbilden von Benutzerberechtigungen


JohnDyr - So 25.11.18 15:43
Titel: Abbilden von Benutzerberechtigungen
Hallo,

ich entwickle grade ein Programm, bei welchem mehrere Benutzer angelegt werden können. Jedem Benutzer kann eine Benutzergruppe zugewiesen werden (Admin, User). Mein Vorhaben ist, dass der Benutzer aus der Gruppe "User", nur bestimmte Elemente im Programm sehen darf.

Wird das ganz stumpf über so etwas wie...


Quelltext
1:
2:
3:
if Benutzergruppe=USER
   Element.Visible = false;
endif


abgebildet? Oder gibt es da elegantere / andere Lösungen, welche gängig sind?

Gruß


Ralf Jansen - Mo 26.11.18 12:14

Kommt drauf an.

Das sich das Rollenverhalten nur daran festmacht was ein bzw. auszublenden ist eher selten. Meistens ist es komplizierter.
Alternativen sind gleich 2 UIs zu haben. Wenn man Logik und UI sauber getrennt hat ist der Aufwand nur begrenzt und gibt dir deutlich mehr Möglichkeiten.

Eine andere Möglichkeit wäre einen Extender Provider [https://msdn.microsoft.com/en-us/library/d6c1xa43.aspx] zu schreiben. Ein Extender Provider ist eine nicht visuelle Komponente die man auf eine From werfen kann und jeder Komponente (scheinbar) Properties hinzufügt. Über so einen Extender Provider kannst du den entsprechenden allgemeinen Code an dieser Komponente zentralisieren und die Sichtbarkeiten dann über den Winfomrs Designer einstellen.


JohnDyr - Mo 26.11.18 14:05

Zitat:

Alternativen sind gleich 2 UIs zu haben. Wenn man Logik und UI sauber getrennt hat ist der Aufwand nur begrenzt und gibt dir deutlich mehr Möglichkeiten.


Zu diesem Punkt hätte ich eine Nachfrage: Ich entwickle also zwei UIs mittels UserControls. Sagen wir mal UcDashboardUser und UcDashboardAdmin. Die Logik ist ausgekapselt in einer anderen Klasse, worauf beide UCs zugreifen. Soweit, so gut. Wenn jetzt der Admin eingeloggt ist und er den UserControl öffnen will, erscheint das UcDashboardAdmin, indem folgende Logik ausgeführt wird:


Quelltext
1:
2:
3:
4:
5:
(Pseudocode):

if (benutzer.gruppe = "ADMIN")
   UcDashboardAdmin.BringToFront()
endif


Verstehe ich das richtig? Oder meinst du es anders?

Danke,
JohnDyr


Ralf Jansen - Mo 26.11.18 16:56

In etwa.

Persönlich würde ich nicht alle UserControls auf der Form rumliegen haben sondern sie erst dann erzeugen wenn ich sie brauche und die die man dann nicht mehr braucht auch gleich wieder zerstören.
Z.B. wenn man immer nur ein zentrales UserControl anzeigt

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
if (benutzer.Group == UserRoles.Admin)
{
   if (shownUserControl != null)
   {
       parentControl.Controls.Remove(shownUserControl);
       shownUserControl.Dispose();
       shownUserControl = null;
   }
   shownUserControl = new UcDashboardAdmin();
   shownUserControl.Data = myLovelyDataModelIWantToShowOnTheUserControl;
   shownUserControl.Dock = Dock.Fill;   
   parentControl.Controls.Add(shownUserControl);
}


Das ganze kann man dann schön noch in eine Methode refactorn der man nur den Typ des anzuzeigenden UserControls übergibt und das zu benutzende Datenmodel.