2010-01-05 11 views
6

Ich speichere eine Liste von "Benutzern" in einer Tabelle. Die Geschäftslogik der Anwendung hat einen Verweis auf ein Objekt mit allen Daten in dieser Tabelle für den aktuell angemeldeten Benutzer. Und in der Lage sein, dem Benutzer Operationen zu ermöglichen, wenn sie den richtigen Zugriff haben.Speichern der Benutzerzugriffsebene in einer Datenbank

Ich frage mich, was ist der beste Weg, um "Zugriffsstufen" zu speichern?

Eine Möglichkeit, die Zugriffsebene als Ganzzahl zu speichern und C# "Flags" zu verwenden, um mehrere Zugriffsebenen zu kombinieren, ohne dass ein paar Felder erforderlich sind, ist das sinnvoll?

Create = 1 
Read = 2 
Update = 4 
Delete = 8 
FullAcc = 16 

Die andere Option, die ich von denke, fühlt sich weniger elegent, aber ich habe es viel getan gesehen:

Read/Write = 1 
R/W + Delete= 2 
Full Access = 3 

Der Grund, warum ich mich frage ist, dass es, wie es scheint wäre einfacher, zusätzliche Elemente zu der zweiten Methode hinzuzufügen, aber irgendwann würde es ein Schmerz in den Arsch zu pflegen. Was sind deine Gedanken?

Antwort

5

Ich habe immer den ersten Ansatz mit Flags bevorzugt. Die Gefahr besteht darin, dass Sie zu viele Berechtigungsstufen erhalten, und Sie müssen Ihre Enumeration erweitern und beginnen, große Zahlen zu verwenden, und müssen daher vielleicht den Datentyp in Ihrer Datenbank zu einem großen int ändern. Für etwas wie Berechtigungen sollte die Anzahl der Optionen jedoch ziemlich begrenzt sein. Der einzige Vorschlag, den ich machen würde, ist, FullAcc als die Summe von Create, Read, Update und Delete zu definieren, anstatt als separate Entity. Auf diese Weise müssen Sie nicht überprüfen, ob ein Benutzer über die Berechtigungen "Update" oder "FullAcc" verfügt, wenn er versucht, etwas zu aktualisieren.

3

Ich würde mit Option # 1 gehen, weil es mir individuelle Flags für jede Art von Zugriff gibt.

Ich würde auch empfehlen, dass Sie Geschichte der Änderungen mit Zeitstempeln speichern.

1

Ich würde die Enum-Route gehen. Es ist stark typisiert, überträgt relativ gut zwischen der db und dem Code (ints und enums gut umgesetzt), Sie können das FlagsAttribute verwenden, um Sicherheitsrechte zu kombinieren, und enums sind ziemlich flexibel, wenn es um Versionsprobleme geht (solange Sie nicht entfernen oder benenne zuvor definierte Enum-Werte um).

1

Ihre 'Flags'-Idee ist flexibler und ermöglicht Ihnen eine beliebige Kombination von Rechten, falls dies jemals erforderlich sein sollte. Der Artikel ‚FullAcc‘ soll nicht als eine bestimmte Nummer in Ihrer Enumeration definiert werden, aber - es sollte eine Kombination von anderen Flags zusammen ODER-verknüpft sein (wie diese, mit einem paar links aus):

enum Rights { Create, read, Update, FullAcc = Create | Read | Update } 

Der Ich sehe nur, dass wenn Sie mehr Elemente zur Enumeration hinzufügen, müssen Sie das FullAcc-Element ändern und dann Ihre FullAcc-Datensätze in der Datenbank identifizieren und den Flag-Wert aktualisieren.

Verwandte Themen