Laden...

Rechtesystem implementieren

Erstellt von koreson vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.177 Views
K
koreson Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren
Rechtesystem implementieren

Moin,

habe gerade eine Forms-Anwendung erstellt, die Buttons, Checkboxes usw enthält.
Der User meldet sich zur Benutzung an, somit ist ein gewisser Rechtelevel gegeben.

Alle Controls sollen einem Rechtesystem von 1-10 unterliegen. User mit dem rechtelevel 3 können zb. einen Button nichzt bedienen, der mit den rechtelevel 10 belegt ist.

Neben den offenschtlichen "if(userrights > x" - Orgien zu Beginn jeder Methode,
würde mich interessieren, wie man das INTELLIGENTER und ELEGANTER lösen kann.

Kann man alle Click-Events einer Form abfangen, den Sender ermitteln und den Zugriff so steuern?

Hat vielleicht jemand ne nette Idee?

Gruss
koreson

139 Beiträge seit 2006
vor 16 Jahren

Wie wärs allen buttons den gleichen ClickHandler zu geben und dann per Tag des Buttons das Minimale Rechtelevel geben.
Beim Eventhandler kanste dann per

if ( (int)sender.Tag < userLevel ) 
{
    if ( sender == Button1 )
        // Das was Button1tun soll
   else if ( sender == Button2 )
   .
   .
   .
}

Deine Buttons auseinander halten.

Gruss Ari
Wer lesen kann ist klar im vorteil!
MSDN
Dein Feund in allen fragen

S
8.746 Beiträge seit 2005
vor 16 Jahren

Ja, allerdings braucht es dazu noch Frameworks, die einen höheren Abstraktionsgrad aufweisen als .NET pur.

Beispiele wären CSLA oder der Composite UI Application Block von MS:

http://staff.southworks.net/blogs/mariano/archive/2006/03/15/260.aspx

S
10 Beiträge seit 2007
vor 16 Jahren

Wenn es sich nur um eine überschaubare Menge an Komponenten handelt, wäre es denkbar, wie TNDAri angedeutet hat, alle Button-Click-Ereignisse auf die selbe Methode zu stoßen.

Du könntest dann eine kleine Datenbank (verschlüsselte Textdatei mit Integritätscheck z.B.) mit deinen Komponenten-Namen (evtl. auch Hashcodes) anlegen.

Die liest du dann ein und prüfst sie in einer Schleife ab.

Praktisch die selbe Lösung wie TNDAri, nur etwas abstrahierter und vermutlich einfacher pflegbar.

Über Reflektion könntest du dann auch wieder eigene Methoden für jeden Button aufrufen, die sich dann VS.Net-typisch über <KomponentenName>_Click aufrufen liessen.

Bei einem neuen Button wäre dann praktisch alles recht gut managebar:

  • Button anlegen, doppelt klicken, anschließend nochmal rüber in den Designer und das Event auf deinen Universal-Handler umgebogen. Danach könntest du normal in der erstellten Funktion weiter schreiben.

  • Neuen Eintrag in deine "Datenbank" mit dem Button-Name und dem Rechtelevel.

F
323 Beiträge seit 2007
vor 16 Jahren

Ich habe mal ne Frage:
Was würde gegen diese Method sprechen?

  • alles was der Nutzer nicht bedienen kann Ausblenden oder Disablen
  • beim initialisieren des Forms/Controls eine switch-Anweisung auf den Rechtelevel und da wird dann gesagt, das halt einige Controls nicht angezeigt werden

Dadurch erspart man sich unübersichtliche if-else-Anweisungen, weil ich finde switch ist übersichtlicher. Man macht das ganze nur einmal je Control und nicht bei jeder Methode.

Entweder ich verstehe da etwas falsch oder ich bin zu intelligent 😁

1.985 Beiträge seit 2004
vor 16 Jahren

Hallo Froggie,

Deine Vorgehensweise ist mit Sicherheit durchführbar, allerdings mit sehr viel Aufwand verbunden. Sobald es ein paar Forms mehr werden, die evtl. noch etwas komplexer aufgebaut sind, steigt der Aufwand erheblich an.

Des Weiteren hat man auch nur eine sehr einfache Rechtestruktur (Level 1-10 beispielsweise). Ganz schnell kommen dann die lieben Kunden auf die Idee, man könnte doch Gruppen einführen, so dass Rechte vererbt werden können. Will man das dann auch alles manuell implementieren, steigt der Aufwand wieder erheblich an.

Ich würde mir daher die von svenson vorgeschlagenen Frameworks ansehen.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo koreson,

user mit dem rechtelevel 3 können zb. einen Button nichzt bedienen, der mit den rechtelevel 10 belegt ist.

Im Konstruktor (hinter InitializeComponents) für alle Controls: buttonX.Enabled = UserLevel >= 10.

Einfach, übersichtlich, effektiv.

herbivore

K
koreson Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

Moin,

danke für die Anregungen.

das Rechtesystem werde ich wohl nach dem enable-Muster machen.
Das Hauptform hat ca 6000 Zeilen, zudem noch mehrere Unterforms, da ist die Einbindung eines zweiten frameworks etwas abschreckend.

Zudem sollen während des Betriebs die Rechte von zwei Controls dynamisch vom Admin vergeben werden, um zb die Eingabe von Lastschriften kurzzeitig zu sperren.
Die Rechteprüfung dieser beiden Buttons erfolgt dann ausnahmsweise in den Click-Methoden.

Also die Rechte aus einer externen xml-Datei zu laden und die Controls in den Form-Konstruktoren an oder abzustellen, schein mir praktikabel und übersichtlich.

So sei es also.

Danke für eure Ausführungen

Gruss
koreson