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

stimmen
17

Ich begegne oft das folgende Szenario, wo ich viele verschiedene Arten von Berechtigungen bieten muß. Ich in erster Linie ASP.NET / VB.NET mit SQL Server 2000 verwenden.

Szenario

Ich möchte ein dynamisches Berechtigungssystem bieten, die auf unterschiedliche Parametern arbeiten können. Lassen Sie uns sagen, dass ich entweder eine Abteilung oder eine bestimmte Person Zugriff auf eine Anwendung geben wollen. Und so tun, dass wir eine Reihe von Anwendungen, die weiter wächst.

In der Vergangenheit habe ich eine der folgenden zwei Möglichkeiten gewählt, dass ich weiß, dies zu tun.

1) Verwenden Sie eine einzelne Permission-Tabelle mit speziellen Spalten, die eine für die Bestimmung, wie anzuwenden, um die Parameter verwendet werden. Die speziellen Spalten in diesem Beispiel sind TypeID und TypeAuxID. Die SQL würde wie folgt aussehen.

SELECT COUNT(PermissionID)
FROM application_permissions
WHERE
(TypeID = 1 AND TypeAuxID = @UserID) OR
(TypeID = 2 AND TypeAuxID = @DepartmentID)
AND ApplicationID = 1

2) Verwenden für jede Art von Berechtigung, eine Zuordnungstabelle, dann sie alle zusammen verbindet.

SELECT COUNT(perm.PermissionID)
FROM application_permissions perm
LEFT JOIN application_UserPermissions emp
ON perm.ApplicationID = emp.ApplicationID
LEFT JOIN application_DepartmentPermissions dept
ON perm.ApplicationID = dept.ApplicationID
WHERE q.SectionID=@SectionID
  AND (emp.UserID=@UserID OR dept.DeptID=@DeptID OR
 (emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
ORDER BY q.QID ASC

Meine Gedanken

Ich hoffe, dass die Beispiele Sinn machen. Ich gepflasterten sie zusammen.

Das erste Beispiel erfordert weniger Arbeit, aber keiner von ihnen wie die besten Antwort fühlen. Gibt es einen besseren Weg, dies zu umgehen?

Veröffentlicht am 04/08/2008 um 18:46
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
10

Ich stimme mit John Downey.

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.

Wenn ein Benutzer kann zum Beispiel sehen Nutzer bearbeiten, das binäre Ergebnis der Operation ist 0000 0011 , die Dezimalzahlen umgewandelt 3. ist
können Sie dann speichern Sie die Erlaubnis eines Benutzers in einer einzigen Spalte Ihrer Datenbank (in unserem Fall wäre es sein , 3).

In Ihrer Anwendung, benötigen Sie nur eine weitere bitweise Operation (OR) zu prüfen , ob ein Benutzer eine bestimmte Berechtigung hat oder nicht.

Beantwortet am 04/08/2008 um 19:23
quelle vom benutzer

stimmen
10

Die Art, wie ich gehe normalerweise über Codierung Erlaubnis Systeme mit 6 Tabellen.

  • Benutzer - das ist ziemlich geradlinig ist der typische Benutzer-Tabelle
  • Gruppen - dies würde auf Ihre Abteilungen bedeutend
  • Rollen - das ist eine Tabelle mit allen Berechtigungen im Allgemeinen auch einen Menschen lesbaren Namen darunter und eine Beschreibung
  • Users_have_Groups - das ist eine many-to-many-Tabelle, welche Gruppen ein Benutzer gehört
  • Users_have_Roles - eine weitere many-to-many-Tabelle, welche Rollen für einen einzelnen Benutzer zugeordnet sind,
  • Groups_have_Roles - die endgültige many-to-many-Tabelle, welche Rollen jede Gruppe

Zu Beginn einer Benutzer-Sitzung würden Sie einige Logik ausführen, das jede Rolle, die sie zugewiesen zieht, so kann jedes Verzeichnis oder durch eine Gruppe. Dann Code, den Sie gegen diese Rollen als Sicherheitsberechtigungen.

Wie ich schon sagte das ist, was ich in der Regel tun, aber Ihre millage variiert.

Beantwortet am 04/08/2008 um 18:56
quelle vom benutzer

stimmen
2

Ehrlich gesagt die ASP.NET Mitgliedschaft / Rollen-Funktionen funktionieren würde perfekt für das Szenario, das Sie beschrieben. Schreiben Sie Ihre eigenen Tabellen / Procs / Klassen ist eine großartige Übung und Sie können sehr viel Kontrolle über winzige Details, aber danach selbst zu tun habe ich geschlossen, es ist besser, nur die in .NET Sachen gebaut zu verwenden. Viele vorhandenen Code wurde entwickelt, um es zu arbeiten, die an gut ist schön. Das Schreiben von Grund hat mich ca. 2 Wochen und es war nicht annähernd so robust wie .NETs. Sie haben so vielen Mist (Passwort-Recovery, automatische Sperre, Verschlüsselung, Rollen, eine Erlaubnis Schnittstelle, Tonnen von Procs usw.) zu codieren und die Zeit besser an anderer Stelle ausgegeben werden könnte.

Sorry, wenn ich nicht Ihre Frage beantworten, ich bin wie der Typ, der sagt, c # zu lernen, wenn jemand eine vb Frage stellt.

Beantwortet am 07/08/2008 um 03:23
quelle vom benutzer

stimmen
2

Neben John Downey und Lösungen jdecuyper habe ich auch hinzugefügt ein „Explicit Deny“ Bit am Ende / Anfang des bitfield, so dass Sie additive Berechtigungen von Gruppe durchführen können, die Rollenmitgliedschaft, und dann Berechtigungen auf ausdrückliches basierend subtrahieren verweigern Einträge, ähnlich wie NTFS funktioniert, permission-weise.

Beantwortet am 04/08/2008 um 19:39
quelle vom benutzer

stimmen
0

Ein Ansatz, den ich in verschiedenen Anwendungen verwendet habe, ist eine generische PermissionToken Klasse zu haben, die eine veränderbare Wert Eigenschaft hat. Dann fragen Sie die gewünschte Anwendung, es sagt Ihnen, welche PermissionTokens notwendig sind, um es zu benutzen.

Zum Beispiel könnten Sie die Versand Anwendung sagen, es braucht:

new PermissionToken()
{
    Target = PermissionTokenTarget.Application,
    Action = PermissionTokenAction.View,
    Value = "ShippingApp"
};

Dies kann natürlich erweitert wird zum Erstellen, Bearbeiten, Löschen usw. und wegen der benutzerdefinierten Eigenschaft Value, jede Anwendung, Modul oder Widget kann seine eigenen erforderlichen Berechtigungen definieren. YMMV, aber dies ist immer eine effiziente Methode für mich, die ich gefunden habe, gut zu skalieren.

Beantwortet am 04/08/2008 um 19:03
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more