Laden...

Grundlegende Frage zu einem Rechtesystem

Erstellt von Thoxx vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.860 Views
Thoxx Themenstarter:in
112 Beiträge seit 2008
vor 15 Jahren
Grundlegende Frage zu einem Rechtesystem

(Ich hoffe, dass ich mich im richtigen Unterforum befinde)

Ich hab ein Programm, in dem Personen erfasst und bearbeitet werden können. Indem Programm habe ich mehrere Tabs und die erfassten Personen sind bereits alle mit einer Rolle (in der DB) versehen und alle erfassten Personen haben theoretisch Zugriff auf das Programm.
Jetzt möchte ich das ganze Programm mit einem Rechtesystem ausstatten (ich weiss, sowas macht man bestimmt schon eher, aber ich hab das ganze auch nur übernommen und muss da jetzt weitermachen ^^), momentan sind erst mal nur 3 Rollen vorgesehen (eine Rolle darf alles sehen und bearbeiten, eine Rolle darf das Programm erst gar nicht starten und die dritte Rolle hat eingeschränkten Zugriff und darf nur weniger Sachen ändern), weitere Rollen könnten eventuell folgen. Innerhalb von den Tabs befinden sich Standardelemente wie Labels, Textboxes, Datagridviews, Comboboxes usw. Bei der Rolle mit eingeschränktem Zugriff müssen teilweise ganze Tabs nicht mehr sichtbar gemacht werden, manchmal aber auch nur einzelne (zB bestimmte Textboxen und Comboboxes sollen nicht sichtbar gemacht werden).

Mein „Startpunkt“ (bzw. die Idee erst mal) ist quasi, dass ich bei Programmstart die WinKennung der angemeldeten Person auslese und das dann mit der internen Rolle der Person abgeglichen wird, somit kann ich schon mal die Rolle im Programm festlegen (und die eine Rolle somit gleich von der Benutzung ausschließen). Allerdings weiss ich jetzt nicht, wie ich sinnvoll weitermachen soll. Ich bräuchte mal eine Idee. Ich könnte ja theoretisch für jedes Element auf der Form eine boolsche Variable erstellen, anhand der festgelegten Rolle dann die Variablen entsprechend belegen und über de Visible, ReadOnly und Enabled Properties anhand der Variablen festlegen, was angezeigt und/oder geändert werden darf. Allerdings erscheint mir das sehr unsinnig und auch irgendwie umständlich.
Und generell weiß ich auch nicht so wirklich wie ich speichern soll, welche Rolle sich welche Elemente anzeigen lassen bzw. welche Elemente geändert werden dürfen. Ich dachte ja erst ich erstelle in der Datenbank eine neue Tabelle, wo dann jedes Element der Anwendung (welches für das Rechtesystem relevant ist) mit einer ID hinterlegt ist und dann noch eine wo hinterlegt ist, welche Rolle welches Element sehen/ändern darf. Das erscheint mir aber auch unsinnig.

Das Problem ist nicht, dass ich es nicht irgendwie umsetzen könnte, sondern viel eher dass ich nicht weiss, wie man es **sinnvoll **umsetzt.
Gibt es da allgemeine Vorgehensweisen, wie man sowas macht?
Oder irgendwas zum anlesen?
Vielleicht hab ich ja generell eine falsche Vorstellung von der Implementierung von so was.

Vielen dank im voraus.
~Thoxx

*edit*

Danke fürs verschieben, hab das Unterforum vorhin völlig übersehen 😮

X
2.051 Beiträge seit 2004
vor 15 Jahren

ich denke es geht eher um die Daten die nicht angezeigt werden dürfen und weniger um die Controls selbst. die zeigen nur die Daten. Ich will ja z.B. Gehalt nicht anzeigen, dabei egal ist ob es eine Combobox oder Textbox ist oder spähter vielleicht noch MaskedBox.

woraus ich hinaus will, ist dass ich die Zugriffsrechte auf die Datenbankfelder definieren würde und in dem Programm abhängig davon welche Daten ein Control anzeigt handeln.

Bei den Rechten selbst muss man natürlich ach bedenken, dass einige Daten eventuell nur indirekt zugreifbar sind. dass heißt die sind z.B. für für die Anzeige gesperrt, aber für Berechnung eines Wertes o.ä. doch erlaubt.

also: erlaubt, gesperrt, indirekt erlaubt

außerdem soll man noch in betracht ziehen, die art der Sperre: Lesen, Ändern, Löschen

2.187 Beiträge seit 2005
vor 15 Jahren

Hallo,

Ich habe dieses Problem auch gehabt.
Ich hab für meine Properties einfach immer noch ein Can-Property implementiert, das einen bool zurück gegeben hat, ob das Feld angezeigt werden darf oder nicht:


public clas ....
{
  public decimal Gehalt{get....}
  public bool CanGehalt{get...}
}

Mit ein bischen Mühe konnte ich das DataBinding von Objekt.CanXYZ an Control.Visible mit einem Componente generalisieren, so dass ich das einfach zusätzlich auf meine Form ziehen kann.

Gruß
Juy Juka

Thoxx Themenstarter:in
112 Beiträge seit 2008
vor 15 Jahren

Xqgene, hm...das ganze auf DB-Ebene (oder dann im DataSet) zu machen wäre natürlich auch eine Idee, allerdings wären die Controls dann ja alle da, aber teilweise leer...wodurch ein Nutzer dann vielleicht denken können, dass da garkeine Daten hinterlegt sind (allerdings weiss ich grad nicht, ob das wirklich ein Problem wäre)

JuyJuka, wie muss ich mir das vorstellen? Wird da dann erst mal bei Programmstart jedem Can-Property ein Wert anhand der Rolle zugewiesen?

Problem ist ja auch, dass dann "Lücken" sind, wenn ich einzelne Elemente ausblende und somit dann die vorhandenen wieder positionieren müsste, damit die Oberfläche nicht wie ein Trümmerfeld aussieht 😁

Vielleicht sollte ich da doch alle anzeigen lassen und nach der Methode von Xqgene die Zugriffe auf die DB-Felder definieren.

2.921 Beiträge seit 2005
vor 15 Jahren

@Thoxx: hast Du schon mal daran gedacht, das ganze mit Aspektorientierung zu implementieren?!

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

X
2.051 Beiträge seit 2004
vor 15 Jahren

ich meinte, dass du die Controls ein-/ausblendest abhängig von den Rechten die auf der "Datenbankebene" aufbauen

also wenn DB-Feld Gehalt nach deinem Rechtesystem nicht angezeigt werden darf, dann blendest du alle Controls, welche die Daten aus dem Feld beziehen. Wenn das Feld bloß nicht editiert werden darf, dann machst du die Steuerelemente ReadOnly, etc.

und da passt der Vorschlag von JuyJuka auch ganz gut dazu.

Thoxx Themenstarter:in
112 Beiträge seit 2008
vor 15 Jahren

Ah okay, mein Fehler...das hab ich falsch verstanden.

Hab mir auch noch mal das von JuyJuka während dem Mittag durch den Kopf gehen lassen, das scheint doch recht gut für mein Problem zu passen.
Muss ich mir noch Gedanken über die Repositionierung der "übrig gebliebenen" Elemente machen.

dr4g0n76, nein daran hab ich noch nicht gedacht, da lese ich nämlich grad zum ersten mal von ;D
aber hab schon was zum einlesen gefunden...

Danke für eure Tipps =)

2.187 Beiträge seit 2005
vor 15 Jahren

Hallo Thoxx,

Wird da dann erst mal bei Programmstart jedem Can-Property ein Wert anhand der Rolle zugewiesen?

Die Can-Properties können von außen gefüllt werden oder "sich selbst" füllen, das ist unabhänig von der Maske.

Bei der neu anordnung der Maske kann ich leider nicht helfen, bei mir wurden die Felder nur disabled.

Gruß
Juy Juka

3.825 Beiträge seit 2006
vor 15 Jahren

Hallo Thoxx,

das ganze auf DB-Ebene (oder dann im DataSet) zu machen wäre natürlich auch eine Idee, allerdings wären die Controls dann ja alle da, aber teilweise leer...wodurch ein Nutzer dann vielleicht denken können, dass da garkeine Daten hinterlegt sind (allerdings weiss ich grad nicht, ob das wirklich ein Problem wäre)

Wenn Du die "verbotenen" Felder im Dataset auf Null setzt dann werden sie beim Zurückspeichern auch in der Datenbank gelöscht. Das ist sicher nicht erwünscht !

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3