Benutzerverwaltung



  • Hallo zusammen,

    ich bin recht neu in das Thema C# eingestiegen und soll nun eine Benutzerverwaltung realisieren.
    Hier mal kur meine Ausgangssituation:

    Startform, auf der ich viele Buttons habe, um auf weitere Forms zu kommen
    --> nicht alle User dürfen auf alle Forms Zugriff haben

    Einzelne Forms
    --> Manche Buttons bzw. Funktionen sollen für manche User zugänglich sein, für manche nicht. Also quasi Lese- und Schreibrechte und teilweise nichts davon

    Unabhänig davon wie der Benutzer sich anmeldet, also übers System oder direkt in dem von mir erstellten Programm werden die Userdaten in einer Tabelle verwaltet

    Bisher hatte ich mir das wie folgt gedacht - Tabellen:
    rights (alle Rechte die es gibt - view, write, invisible ..)
    rolls (alle Rollen die es gibt)
    roll_rights (Rechte und Rollen m:n verknüpft)
    user
    user_roll (welche Rolle hat welcher user m:n)

    Würde das bisher passen?

    Nun kommen meine Schwierigkeiten .... wie weise ich dies meiner Form zu?
    Angenommen user "Hans" in der Gruppe "Lager" darf auf einer Form einen Button sehen folglich auch Klicken.
    Dagegen darf user "Emma", Gruppe "Einkauf" den Button nicht sehen.

    Muss ich daher für jedes Steuerelement und jede Funktion eine extra Abfrage machen? Oder geht das, dass ich das pauschal über die Rechte allegmein auf einer Form definieren kann?

    Überlegung wäre auf jeden Fall das ganze über Dictionary<key, value> zu machen
    Was haltet ihr davon?

    Und was, wenn ein user in mehreren Gruppen Mitglied ist?

    Hat jemand in die Richtung schon Erfahrung oder kann mir gute Hilfen nennen?!
    Vielen Dank und viele Grüße
    Bonaqua



  • Entweder, du arbeitest dynamisch mit WPF, oder du setzt die Eigenschaft Enabled der Button-Klasse, bei den Buttons auf false, die für einen User nicht benutzt werden soll.
    Du müsstest also schauen, dass du alle Buttons durchgehst und User entsprechend auf false setzt, damit der User diesen Button nicht klicken kann.
    Aber vielleicht weiß jemand noch eine bessere Lösung.



  • Ich würde das mit einer Datenbank machen, da brauchst du nicht jeden User einzeln abzutippen und auf true bzw. false setzen. SQLite kannste z.B. dafür nehmen. Ausserdem ist es einfacher wenn ein User mal die Rolle/Status/Gruppe wechselt, weil ändern musst du dann im Prinzip gar nix, ausser halt einen Eintrag in DB.



  • Ok, aber das bedeutet, dass ich das ganze wirklich bei jedem Button oder Funktion, die nicht für alle User gedacht ist, prüfen muss?

    Hätte eigentlich auf Benutzergruppen geprüft und nicht auf einzelne User ... wobei ich dann eben nicht sicher bin, wie ich das umsatzen soll, wenn ein User in mehrern Gruppen Mitglied ist ...



  • Hast du nicht gelesen was ich geschrieben hab, oder verstehst du das Prinzip einer Datenbank nicht?



  • Er muss aber trotzdem die GUI an die individuellen Rechte anpassen und das ist der Punkt wo es hässlich wird.

    Das passiert ja nicht automatisch durch ein wenig Datenbank-Magie im Hintergrund.

    @Bonaqua
    In den Gruppen sehe ich nicht so das Problem. Nur wenn sie sich widersprechen: Gruppe A darf in FormX, Gruppe B darf nicht in FormX und ein User liegt in beiden Gruppen. Dann ist aber das Gruppenschema an sich defekt.



  • Das denke ich doch auch, allein in der DB was festlegen reicht ja nicht - das ganze sollte auch auf die GUI angewendet werden.


    Das ist genau das Problem, an dem ich hänge ... 😞
    Eine Überlegung wäre dann eine neue Gruppe anzulegen, die eben die Rechte so gesetzt bekommt ... hätte dann nur die Angst, dass am Ende jeder User eine eigene Gruppe hat und das wäre ja nicht der Sinn der Sache.



  • Wenn die Gruppenzugehörigkeit die Benutzerrechte nur erweitert und nicht beschränkt, hast Du keine Probleme mehr.

    Würde das in deinem Fall passen?



  • Ja, das würde bei mir zutreffen.



  • Wie würde das dann Eurer Meinung nach ausschauen?!

    Soll ich vor einem Aufruf immer auf das entsprechende Recht prüfen?
    In diesem Beispiel wäre es z.B. das Anlegen eines neuen Produktes und mein Recht wäre "add_row".
    Dann in meiner Klasse auf den user, gruppenzugehörigkeit, recht und die zugehörige gui geprüft und erhalte true oder false zurück.
    Würde dann etwa wie folgt aussehen ...

    private void btnAddProdukt_Click(object sender, EventArgs e)
    {
    //Prüfung auf Schreibrechte  - add_row
    if (right == true)
    {
    //Aktion durchführen
    }
    if (right == false)
    {
    //Passiert nichts ...
    }
    }
    

    Wenn ich nun aber den Button gar nicht erst anzeigen lassen möchte,
    sollte ich dies ja direkt nach InitializeComponent(); machen, oder?

    Dabei müsste ich dann ja (wenn es mehr als nur die Buttons betrifft) fast jedes Steuerelement durchgehen?!?!
    Falls ja, wie kann man das über die Rechte am besten lösen? Kann ja nicht für jedes Steuerelement ein Recht vergeben - oder doch?



  • So wie ich das sehe, sind die Buttons abhängig von den Rechten der User, also schätze ich, dass du das schon machen musst. Da ich solch ein Problem noch nicht hatte, weiß ich nicht, ob ich dir optimale Lösung dazu geben kann. Aber ich würde wohl versuchen, alle Buttons in eine Collection zu bekommen und dem User entsprechened die Werte in einer Schleife setze.



  • µ schrieb:

    Er muss aber trotzdem die GUI an die individuellen Rechte anpassen und das ist der Punkt wo es hässlich wird.

    Das ist klar, aber er muss dann nicht jeden User selbst abfragen, sondern halt nur der Gruppe die Rechte zuordnen. Schreibarbeit ist das schon, aber bei weitem nicht so viel wie jeden User selbst eintragen im Code.

    Das mit den mehreren Gruppen kannst du lösen mit primärer und sekundärer Gruppe, wobei man nur in einer primären Gruppe sein kann, aber in mehreren sekundären Gruppen. Die primäre Gruppe hat natürlich priorität, sprich wenn der User in Gruppe A ist, und die etwas nicht darf, er aber gleichzeitig in Gruppe B ist, die das darf, dann kann er es trotzdem nicht machen, weil seine primäre Gruppe A und nicht B ist. Wenn der User das dann trotzdem dürfen soll, muss er seine primäre Gruppe wechseln.



  • Hallo Bonaqua,

    du mußt ja irgendwie eine Zuordnung "Rechte -> Aktionen" haben.
    Wenn du ein Objekt für deine Rechte (entsprechend des Users bzw. dessen Gruppe) hast, dann schreib dir einfach eine Methode, welche direkt im Konstruktor aufgerufen wird:

    public MyForm(Rights rights)
    {
      InitializeComponent();
    
      SetRights(rights);
    }
    
    void SetRights(Rights rights)
    {
      buttonSave.Enabled = rights.CanSave;
      buttonPrint.Visible = rights.CanPrint;
    
      // etc. ...
    }
    

    Statt "Rights" kann man natürlich auch "Authorisation", "Privilege" oder "Access" o.ä. benutzen...


Log in to reply