Wird zum Definieren von Berechtigungssätzen in c # verwendet

8

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 ?

  • sein
  • 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

    
Deeptechtons 23.04.2012, 04:47
quelle

2 Antworten

10

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:

    %Vor%

    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:

    %Vor%
Matthew Scharley 23.04.2012, 04:58
quelle
5
  1. Bitweises OR / AND für Werte von enum, die mit [Flags] markiert sind, sind Werte derselben Aufzählung.
  2. Integer ist sinnvoll, Enum-Werte in der Datenbank zu speichern.
  3. Nein, Sie müssen keine zusätzlichen Enum-Werte hinzufügen, können dies jedoch für conviniece tun.

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     

Alexei Levenkov 23.04.2012 04:57
quelle

Tags und Links