Frage

Ich wollte eine Frage hier um fragen, ob mein Design für einige Benutzer / Rollen Datenbank-Tabellen war akzeptabel, aber nach einigen Recherchen ich auf diese Frage kam:

Was ist der beste Weg, um mehrere Berechtigungstypen zu behandeln?

Es klingt wie ein innovativer Ansatz, so dass anstelle einer many-to-many-Beziehung users_to_roles Tisch, ich habe (Typ int Daten nehme ich an) mehrere Berechtigungen definiert als eine einzige Dezimalstelle. Das bedeutet, dass alle Berechtigungen für einen einzelnen Benutzer sind in einer Reihe. Es wird wahrscheinlich nicht sinnvoll, bis Sie die andere Frage lesen und beantworten

Ich kann nicht mein Gehirn um diesen zu bekommen. Kann jemand bitte den Umwandlungsprozess erklären? Es klingt „richtig“, aber ich bin einfach nicht bekommen, wie ich die Rollen in eine Dezimalzahl umwandeln, bevor es in der db geht, und wie sie zurück umgewandelt werden, wenn es darum geht, aus dem db. Ich bin mit Java, aber wenn man es aus Stub, das wäre auch cool sein.

Hier ist die ursprüngliche Antwort in der vagen Hoffnung, wird die andere Frage gelöscht:

"Ich persönlich manchmal gekennzeichnet Aufzählung von Berechtigungen verwenden. Auf diese Weise können Sie AND, OR, NOT und XOR Bit-Operationen auf die Elemente der Aufzählung.

[Flags]
public enum Permission
{
    VIEWUSERS = 1, // 2^0 // 0000 0001
    EDITUSERS = 2, // 2^1 // 0000 0010
    VIEWPRODUCTS = 4, // 2^2 // 0000 0100
    EDITPRODUCTS = 8, // 2^3 // 0000 1000
    VIEWCLIENTS = 16, // 2^4 // 0001 0000
    EDITCLIENTS = 32, // 2^5 // 0010 0000
    DELETECLIENTS = 64, // 2^6 // 0100 0000
}

Dann können Sie mehrere Berechtigungen kombinieren, um den UND bitweise Operator.

Zum Beispiel, wenn ein Benutzer anzeigen kann und Bearbeiten von Benutzern, das binäre Ergebnis der Operation ist 0000 0011, die 3 ist eine Dezimalzahl umgewandelt. Sie können dann speichern Sie die Erlaubnis eines Benutzers in einer einzigen Spalte Ihrer Datenbank (in unserem Fall wäre es 3 sein).

In Ihrer Anwendung, müssen Sie nur eine andere bitweise Operation (OR) zu prüfen, ob ein Benutzer eine bestimmte Berechtigung hat oder nicht. "

War es hilfreich?

Lösung

Sie verwenden bitweise Operationen. Der Pseudo-Code würde wie etwas sein:

bool HasPermission(User user, Permission permission) {
    return (user.Permission & permission) != 0;
}

void SetPermission(User user, Permission permission) {
    user.Permission |= permission;
}

void ClearPermission(User user, Permission permission) {
    user.Permission &= ~permission;
}

Es ist erlaubt, der Aufzählungstyp in Ihrem Beitrag definiert, obwohl gleich welche Art es Bedarf an einem ganzen Zahl artiger Typ basieren soll. Das gleiche gilt für das User.Permission Feld.

Wenn diese Operatoren (&, | = und & =). Nicht Sinn machen, dann lesen Sie auf bitweise Operationen (bitweise UND und bitweises ODER)

Andere Tipps

Eigentlich ist dies, wie wir Autorität innerhalb einer ziemlich großen Web-Anwendung bestimmen, dass ich die DBA für mich.

Wenn Sie so etwas wie dies tun werden, werden Sie wirklich davon profitieren, ein Zahlen Tabelle . Es wird Ihre Berechnungen viel schneller machen.

Die Grundeinstellung enthält die folgenden Tabellen:

  1. Gruppen - für viele zu viele von Benutzern und Sicherheits Punkte tun
  2. Sicherheit Punkte - die einen Wert für anonyme Berechtigung und eine für authentifizierte Benutzer enthalten, die nicht Teil einer separaten Gruppe sind
  3. Gruppensicherheits Punkt Join-Tabelle
  4. Eine spezielle BitMask Zahlen Tabelle, die Einträge für die ^ 2 Werte enthält. Somit gibt es einen Eintrag für 2 (2) und zwei Einträge für drei (2 und 1). Dies hält uns davon ab, die Werte jedes Mal zu berechnen.

Zuerst haben wir festzustellen, ob der Benutzer angemeldet ist. Wenn sie nicht, dass wir die anonyme Berechtigung für die Sicherheitsposition zurück.

Als nächstes werden wir feststellen, ob der Benutzer ein Mitglied einer mit dem Sicherheits Punkt durch eine einfache EXISTS verbundenen Gruppen ein JOIN verwenden. Wenn sie nicht, dass wir den Wert zurück mit den authentifizierten Benutzer zugeordnet ist. Die meisten der anonymen und authentifizierten Standardwerte auf 1 gesetzt sind auf unserem System, weil wir verlangen, dass Sie zu bestimmten Gruppen gehören.

  

. Hinweis: Wenn ein anonymer Benutzer einen keinen Zugang erhält, ist die Schnittstelle wirft sie in Box in ein Protokoll über, damit sie sich wieder anmelden und versuchen

Wenn der Benutzer ist Mitglied in einer oder mehreren Gruppen, dann wählen wir verschiedene Werte aus der BitMask Tabelle für jeden der Werte für die Gruppen definiert. Zum Beispiel gehörten, wenn Sie drei Gruppen und hatten eine Berechtigungsstufe von 8, ein mit 12 und dem letzten mit 36, unserem ausgewählten gegen die Bitmaskentabelle würde 8 zurückkehren, 8 und 4 sowie 4 und 32. Dadurch deutlichen einen bekommen wir die Zahl 4, 8 und 32, die richtig Masken zu 101.100 Bit.

Dieser Wert wird als Benutzer Berechtigungsstufe zurückgeführt und von der Website verarbeitet werden.

Sinn?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top