Jaký je nejlepší způsob, jak zvládnout různé typy oprávnění?

hlasů
17

Často se setkávám s následující scénář, ve kterém musím nabídnout mnoho různých typů oprávnění. I v první řadě použít ASP.NET / VB.NET SQL Server 2000.

Scénář

Chci nabídnout dynamický oprávnění systém, který může pracovat na různých parametrech. Řekněme, že chci dát buď oddělení nebo jen konkrétní osobě přístup k aplikaci. A předstírat, že máme celou řadu aplikací, které neustále roste.

V minulosti jsem si vybral jednu z následujících dvou způsobů, které znám, jak toho dosáhnout.

1) Pomocí jediného povolení tabulku se speciálními sloupy, které se používají pro určení, jak použít parametry. Speciální sloupce v tomto příkladu jsou typeid a TypeAuxID. SQL bude vypadat nějak takhle.

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

2) Použít mapovací tabulku pro každý typ povolení, pak je všechny spojí.

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

Mé myšlenky

Doufám, že tyto příklady smysl. dlážděné jsem je dohromady.

První příklad vyžaduje méně práce, ale ani jeden z nich pocit, že nejlepší odpověď. Existuje lepší způsob, jak řešit tento problém?

Položena 04/08/2008 v 18:46
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
10

Souhlasím s Johnem Downey.

Osobně někdy používají označenou výčet oprávnění. Tímto způsobem můžete použít AND, OR, NOT a XOR bitové operace na položky výčtu je.

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

Potom můžete kombinovat několik oprávnění pomocí operátoru bitového.

Například, pokud uživatel může prohlížet a upravovat uživatele, binární výsledek operace je 0000 0011, která převede na desítkové je 3.
Potom můžete uložit svolení jednoho uživatele do jednoho sloupce vaší databáze (v našem případě by to se 3).

Uvnitř aplikaci, stačí jinou bitovou operací (OR) za účelem ověření, zda uživatel má zvláštní povolení či nikoliv.

Odpovězeno 04/08/2008 v 19:23
zdroj uživatelem

hlasů
10

Jak jsem obvykle jít o kódovacích systémech předchozího písemného souhlasu je s 6 stoly.

  • Uživatelé - to je docela rovně vpřed je váš typický uživatelé tabulky
  • Skupiny - to by bylo synonymem pro vaše odděleními
  • Rolí - to je tabulka se všemi oprávněními obvykle také včetně čitelného názvu a popisu
  • Users_have_Groups - to je many-to-many tabulku jakých skupin uživatel patří do
  • Users_have_Roles - další many-to-many tabulka jaké role jsou přiřazeny k jednotlivému uživateli
  • Groups_have_Roles - konečný many-to-many tabulka jakou roli každá skupina má

Na začátku relace uživatelů byste spustit nějakou logiku, která vytahuje každou roli mají přiřazenou, buď adresář nebo prostřednictvím skupiny. Pak jste kód proti těmto rolím jsou vaše oprávnění zabezpečení.

Jak jsem řekl, je to, co jsem obvykle dělat, ale vaše millage se mohou lišit.

Odpovězeno 04/08/2008 v 18:56
zdroj uživatelem

hlasů
2

Upřímně ASP.NET členství / Role funkce bude fungovat dokonale pro scénář jsi popsal. Psát své vlastní tabulky / procs / třídy je skvělý výkon a můžete dostat velmi pěkný kontrolu nad nejmenších detailů, ale poté, co dělá to sám jsem dospěl k závěru, že je lepší, aby stačí použít vestavěný .NET věci. Mnoho existující kód je navržen tak, aby jej vyřešit, což je příjemné na dobře. Psaní od začátku trvalo mi asi 2 týdny a bylo-li v blízkosti tak robustní jako .NETs. Budete muset kód tolik kecy (obnovení hesla, auto výluka, šifrování, role, je povolení rozhraní, tuny procs, etc) a doba by mohla být lépe využity jinde.

Omlouvám se, jestli jsem neměl odpověď na vaši otázku, jsem jako člověka, který říká, že se učit c #, když někdo položí otázku vb.

Odpovězeno 07/08/2008 v 03:23
zdroj uživatelem

hlasů
2

Kromě John Downey a řešení jdecuyper to jsem také přidána „Explicit Deny“ trochu na konci / začátku bitfield, takže můžete provést oprávnění aditivní podle skupiny, role členství, a pak odečíst oprávnění založené na explicitní popřít záznamů, podobně jako funguje NTFS, povolení-moudrý.

Odpovězeno 04/08/2008 v 19:39
zdroj uživatelem

hlasů
0

Přístup Použil jsem v různých aplikacích je mít obecnou třídu PermissionToken, která má proměnlivý vlastnost hodnota. Potom dotaz požadované aplikace, to vám řekne které PermissionTokens je zapotřebí, aby ji používat.

Například vodní doprava aplikace může říct, že potřebuje:

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

To může být samozřejmě rozšířen vytvářet, upravovat, mazat a etc, protože majetku na zakázku hodnoty libovolné aplikace, modul nebo widgetu může definovat své vlastní požadovaná oprávnění. YMMV, ale to byla vždy účinná metoda pro mě, který jsem našel na měřítko dobře.

Odpovězeno 04/08/2008 v 19:03
zdroj uživatelem

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