Jaki jest najlepszy sposób, aby obsługiwać wiele rodzajów uprawnień?

głosy
17

Często spotkać następujący scenariusz gdzie potrzebne do zaoferowania wiele różnych typów uprawnień. I głównie użyć ASP.NET / VB.NET SQL Server 2000.

Scenariusz

Chcę zaoferować dynamiczny system uprawnień, które mogą pracować na różnych parametrów. Załóżmy, że chcę dać albo wydział lub tylko konkretnej osobie dostęp do aplikacji. I udawać, że mamy szereg aplikacji, które rośnie.

W przeszłości, wybrałem jeden z następujących dwóch sposobów, które znam to zrobić.

1) Za pomocą pojedynczej tabeli uprawnień ze specjalnych kolumnach, które są używane do określania, jak stosować parametry. Specjalne kolumny w tym przykładzie są TypeID i TypeAuxID. SQL będzie wyglądać następująco.

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

2) wykorzystując tablicę mapowania dla każdego z rodzajów uprawnień, a następnie łączenie ich razem.

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

Moje myśli

Mam nadzieję, że przykłady sensu. I brukowane je razem.

Pierwszy przykład wymaga mniej pracy, ale żaden z nich nie czuje się jak najlepszą odpowiedzią. Czy istnieje lepszy sposób, aby sobie z tym poradzić?

Utwórz 04/08/2008 o 18:46
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
10

Zgadzam się z John Downey.

Osobiście czasami użyć oflagowany wyliczenie uprawnień. W ten sposób można używać AND, OR, NOT i XOR bitowe operacje na pozycji wyliczenia za.

"[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
}"

Następnie można połączyć kilka uprawnienia za pomocą operatora AND bitowe.

Na przykład, jeśli użytkownik może przeglądać i edytować użytkowników, binarny wynik operacji jest 0000 0011, który przekształcany jest na dziesiętne 3.
Następnie można przechowywać zgody jednego użytkownika w jednej kolumnie bazy danych (w naszym przypadku byłoby wynosi 3).

Wewnątrz aplikacji, wystarczy kolejna operacja bitowe (OR) w celu sprawdzenia, czy użytkownik ma szczególne uprawnienia lub nie.

Odpowiedział 04/08/2008 o 19:23
źródło użytkownik

głosy
10

Sposób, w jaki zwykle go o systemach kodowania zgody jest o 6 stolików.

  • Użytkowników - to jest dość proste to jest typowy stół użytkowników
  • Grupy - byłoby to równoznaczne do działów
  • Role - jest to tabela ze wszystkimi uprawnieniami na ogół w tym także czytelny dla człowieka nazwy i opisu
  • Users_have_Groups - to wiele-do-wielu tabeli Jakie grupy użytkownik należący do
  • Users_have_Roles - kolejna wiele-do-wielu tabeli jakie role są przypisane do indywidualnego użytkownika
  • Groups_have_Roles - ostateczna wiele-do-wielu tabeli jakie role każda grupa ma

Na początku sesji użytkowników będzie uruchomić jakąś logikę, która wyciąga każdą rolę mają przypisany, ani katalogu lub poprzez grupę. Następnie kod przeciwko tych rolach swoich uprawnień zabezpieczeń.

Tak jak mówiłem jest to, co zwykle zrobić, ale Twój Millage mogą się różnić.

Odpowiedział 04/08/2008 o 18:56
źródło użytkownik

głosy
2

Szczerze członkostwa ASP.NET / Role cechy będzie działać idealnie do scenariusza opisanego. Pisania własnych tabel / procs / klasy jest doskonałym ćwiczeniem i można dostać bardzo ładny kontrolę nad najdrobniejszych szczegółów, ale po to się robi mam stwierdziła, że ​​lepiej po prostu użyć wbudowanego w .NET rzeczy. Wiele istniejącego kodu jest przeznaczony do pracy wokół niego, który jest miły w dobrze. Pisanie od podstaw zajęło mi około 2 tygodni i nie było w pobliżu tak wytrzymałe jak .NETs. Trzeba kodować tyle bzdura (przypomnienie hasła, automatyczne blokowanie, szyfrowanie, role interfejsu pozwolenie, mnóstwo proca, etc), a czas może być lepiej wydać gdzie indziej.

Niestety, jeśli nie odpowie na twoje pytanie, jestem jak facet, który mówi, aby dowiedzieć się C #, gdy ktoś zadaje pytanie Vb.

Odpowiedział 07/08/2008 o 03:23
źródło użytkownik

głosy
2

Oprócz John Downey i rozwiązań jdecuyper, w Dodałem też „Explicit Deny” trochę na końcu / początku bitfield, dzięki czemu można wykonywać uprawnienia dodatków według grup, przynależności do naśladowania, a następnie odjąć uprawnień w oparciu o wyraźne zaprzeczyć wpisy, podobnie jak działa NTFS, pozwolenie mądry.

Odpowiedział 04/08/2008 o 19:39
źródło użytkownik

głosy
0

Podejście Użyłem w różnych aplikacjach jest mieć ogólną klasę PermissionToken która ma zmienne właściwości Value. Wtedy zapytania żądanej aplikacji, to powie Ci, które są potrzebne PermissionTokens aby ją wykorzystać.

Na przykład, aplikacja wysyłka może powiedzieć, że potrzebuje:

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

To może być oczywiście przedłużony tworzyć, edytować, usuwać itp i, ze względu na właściwości niestandardowych Wartość dowolnej aplikacji, moduł lub widżet może zdefiniować własne wymagane uprawnienia. YMMV, ale to zawsze było skutecznym sposobem dla mnie, który znalazłem się dobrze skalować.

Odpowiedział 04/08/2008 o 19:03
źródło użytkownik

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