Da ich bei meinem aktuellen Projekte sowohl die Services als auch den Client mittels Berechtigungen absichern muss, war die Umsetzung der Berechtigungen eine wichtige Frage für mich. Diese habe ich relativ einfach aber dennoch effektiv mit Enumerations lösen können. Berechtigungen setzen sich bei meiner Anwendung aus einem Bereich wie z.B. Studenten, Studiengänge o.ä. und einem dazugehörigen Zugriffsrecht wie z.B. Lesen, Schreiben, o.ä. zusammen.
Beide Werte werden über Enumerations in Kombination mit Flags zusammengesetzt. In der Datenbank werden dann allerdings nur einzelnen Flagwerte gespeichert. Meine Enumeration sieht z.B. folgendermaßen aus :
Bereiche ( AccessDomains.cs )
Berechtigungen ( AccessMode.cs )
In der Datenbank kann ich nun für jeden Benutzer eine Kombination aus Bereich und Berechtigung speichern. So z.b. 128 | 3
Dies würde dann bedeuten, dass der Benutzer für den Bereich SVStudenten die Zugriffsrechte Lesen und Schreiben hat. Aber wie komme ich denn auf 3 ? In der Codedatei stehen ja nur Lesen und Schreiben als einzelne Werte. Man kann diese Werte allerdings mittels eines ‘&‘ bzw. eines ‘|‘ kombinieren. Schreibe ich z.b.
var myberechtigung = AccessMode.Read & AccessMode.Write;
int berechtigungCode = (int)myberechtigung; // = 3
so erhalte ich einen AccessMode Wert der beide beinhaltet und als int gecastet dann den addierten Wert ergiebt. Das funktioniert allerdings nur dann, wenn man das Attribut “[Flags]” in der Klasse angibt und die Flagschreibweise in der Enumeration verwendet und ausschließlich Bitwerte nutzt.
Um mir später dann die Kontrolle zu erleichtern kann ich auch den Berechtigungscheck relativ einfach gestalten. Dieser sieht bei dem folgenden Beispiel ähnlich:
var myAuth = AccessMode.Read & AccessMode.Write;
if ( ( myAuth & AccessMode.Read ) == myAuth ) //returns true
if ( ( myAuth & AccessMode.Delete ) == myAuth ) //returns false
Berechtigungen im Code zu überprüfen ist wie man sieht also kein Hexenwerk und kann relativ einfach und sauber implementiert werden.