Anstatt jede Berechtigung in einzelne Spalten oder SQL-Server-Tabellen zu zerlegen, überdenken wir die Verwendung von Flag
attribute in Enum
zur Verwendung mit bitweisen Operationen. Unsere Anwendung definiert Endpunkte (nicht die aus Ruhediensten) für den Zugriff auf Ressourcen (lesen, ändern, aktualisieren) und jeder Benutzer hat Berechtigungen wie zB Bob has permissions to Read, Modify resource X
. Wenn also Bob kommt und auf diese Ressource zugreift, prüfen wir, ob bob die Berechtigung x hat . Jetzt, wo wir das anwenden werden, sind hier meine Zweifel klar.
Angenommen, Bob hat Lese-, Schreib- und Löschberechtigungen für Ressourcen, die benannte Aufzählungen verwenden. Permission.Read | Permission.Write | Permission.Delete
Ist das Endergebnis von bitweise AND eine Ganzzahl oder eine andere Enum?
Zum Speichern dieser Berechtigung in der Datenbanktabelle sollte die Spalte ein integer
?
Wenn die Antwort auf Frage 1 Enum
ist, sollte ich dann eine andere Eigenschaft in der Permissions
enum definieren, die den ganzzahligen Wert von Bit weise und Operation darstellt?
disclaimer:
Der Bob, auf den im Beispiel Bezug genommen wird, repräsentiert keinen Benutzer im Stack-Überlaufnetzwerk von Websites oder einer anderen Person. Es ist nur ein anderes Zeichen
Um Ihre Fragen der Reihe nach zu beantworten:
Angenommen, Sie haben das [Flags]
-Attribut auf enum
gesetzt und verwenden den korrekten Operator ( &
und |
für bitweise Operationen). Dies ist im Wesentlichen beides. Wenn Sie das Ergebnis in eine ganze Zahl umwandeln, erhalten Sie die bitweise und die relevanten Werte, dh. 7 für dein Beispiel. Wenn Sie .ToString()
verwenden, erhalten Sie eine Zeichenfolge zurück, die angibt, dass der Wert alle drei Werte enthält. Ich glaube, dass es irgendwo eine HasFlags()
-Methode gibt, aber der meiste Code, den ich gesehen habe, benutzt den bewährten bitweisen Code für Vergleiche, zB:
Aus technischer Sicht hilft die C # -Sicherheit, die Dinge in Ordnung zu halten und das Ergebnis von |
ing oder &
ing von zwei enum
s desselben Typs ist ein anderes enum
vom gleichen Typ, aber alle enum
s sind einfach ganze Zahlen und können in den meisten Fällen als solche behandelt werden, obwohl einige Dinge explizite Umwandlungen von int
benötigen.
Es sollte ein integraler Typ sein, ja. Ich glaube, dass der Standardtyp für eine Enumeration Int32
ist. Sie können dies jedoch explizit festlegen, wenn Sie die Datenbank und den Code genau abgleichen möchten.
In Anbetracht all der oben genannten Punkte kann es immer noch sinnvoll sein, vordefinierte Werte für häufig verwendete Berechtigungssätze zu haben, z. B. ReadWrite
. Insbesondere wird ein None
-Element für alle Enums von Microsoft empfohlen, insbesondere wenn Sie Werte umwandeln. Dies ermöglicht einen Fallback und einen gültigen Wert für frisch initialisierte Variablen sowie einen vernünftigen Wert für default(Permissions)
. Sie können Werte in Ihrer Enumeration basierend auf anderen wie folgt festlegen:
Normalerweise definieren Sie solche Enums mit FlagsAttribute , d. h.
%Vor%Wenn Sie auf diese Weise definiert sind, können Sie verschiedene Werte mit | kombinieren (oder) Operation:
%Vor%Bitweises AND gibt Ihnen 0 für Enum-Werte, die eindeutige Flags darstellen, aber üblicherweise zum Maskieren anderer Bits verwendet werden:
%Vor%Beachten Sie, dass das logische UND (& amp; & amp; & amp; amp; & amp; & amp;; & amp; & amp;; & amp; & amp; ampl;) nicht auf Aufzählungswerte angewendet werden kann
Tags und Links .net c# permissions enums flags