Sdílet prostřednictvím


Navrhování oprávnění

Oprávnění představuje možnost pro přístup k chráněnému prostředku nebo provedení chráněné operace. Když implementujete vlastní třídu oprávnění, musíte provést několik rozhodnutí návrhu vysoké úrovně. Jeden z prvních kroků je určit přesně, jaký prostředek je určený k ochraně vašim vlastním oprávněním.

Chcete dále rozhodnout, zda jsou zde nějaké obavy o překrývajících se oprávnění. Ačkoli se chcete vyhnout dvěma oprávnění, která chrání stejný prostředek, v některých situacích se jim nelze rozumně vyhnout. Například oprávnění k přístupu do nespravovaného kódu může také zahrnovat jiné oprávnění, protože kód, který má uděleno oprávnění k přístupu do nespravovaného kódu, může dělat téměř cokoli pomocí nespravovaného rozhraní API. Však v případě, kdy nebylo uděleno oprávnění k přístupu do nespravovaného kódu, stále potřebujete udělit oprávnění k přístupu do jiných konkrétních zdrojů. Proto nemá smysl, aby oprávnění k přístupu do nespravovaného kódu bylo oddělené od jiných oprávnění.

Jak poznáte, zda je překrytí v pokrytí oprávnění spravovatelné? Neexistuje žádná absolutní odpověď, ale jeden přemýšlí o tom, zda jedno z oprávnění představuje další jemně odstupňovaný přístup, než jiné oprávnění tak, aby bylo obvykle snadněji uděleno než jiné oprávnění. Když se jedná o tento případ, udělení přístupových práv je snadno proveditelné v mnoha případech, které usnadňují úlohu správci.

Poté, co jste se rozhodli, jaký prostředek ochrání vaše oprávnění a byly vyřešeny problémy o překrytí oprávnění, musíte rozhodnout, jak jemné by mělo být řízení přístupu. Odpověď na tuto otázku ovlivňuje způsob, jakým jste navrhovali proměnné, které představují stav oprávnění a určuje, zda správci mohou nakonfigurovat přístup k chráněnému prostředku. Může také ovlivnit výkon, snadnou použitelnost a jiné faktory.

Pro ilustraci některých z těchto problémů návrhu, zvažte několik návrhů, které by byly vybrány pro Třídu FileIOPermission, kterou poskytuje rozhraní .NET Framework. Každá volba návrhu ovlivňuje proměnné, které představují stav oprávnění.

  • Jeden bit, který znamená "použít všechny soubory" nebo "nepoužít žádné soubory", v závislosti na jeho hodnotě.

  • Dva bity znamenají "číst všechny soubory" a "zapsat všechny soubory", či nikoli, v závislosti na jejich hodnotách.

  • 26 bitů znamená "používat všechny soubory na zadané jednotce".

  • Pole řetězců obsahující všechny soubory, ke kterým je umožněn přístup.

Jasně existují různé kompromisy ke zvážení. Například jednobitové oprávnění je velmi jednoduché, rychlé a snadné k pochopení, ale představuje volbu vše nebo nic pro správce, což nemusí být žádoucí. Další možnosti určující složitější reprezentace stavu oprávnění mohou zpomalit výkon do určité míry. Musíte tyto kompromisy vzít v úvahu a měli byste zvážit, že byste neměli vytvářet více oprávnění k ochraně stejného prostředku. Obecně byste měli navrhnout vaší třídu oprávnění tak, aby stav oprávnění nebyl tak složitý, podle potřeby, aniž by významně ovlivňoval výkon.

Přestože jiné návrhy jsou možné, většina oprávnění postupuje jedním z následující standardních vzorů návrhu, nebo jejich kombinace:

  • Logická oprávnění. Tento nejjednodušší druh objektu oprávnění obsahuje jeden nebo více bitů, z nichž každý odpovídá "oprávnění dělat X". Buď oprávnění máte nebo nemáte. Příklad tohoto typu oprávnění je třída SecurityPermission, jejíž stav obsahuje booleovské proměnné představující právo provádět různé akce, jako například oprávnění k volání do nespravovaného kódu, z nichž je každé buď povoleno, či nikoli.

  • Úrovně oprávnění. Tato podrobnější forma oprávnění má proměnné, které představují každý druh přístupu jako číslo od nuly (znamená vůbec žádný přístup) některému vyššímu číslu (znamená zcela neomezený přístup), s několika úrovněmi mezi těmito dvěma. Například můžete použít třídu UIPermission k vyjádření různé úrovně oprávnění pro používání oken, bez oprávnění uživatelského rozhraní k neomezeným oprávnění uživatelského rozhraní, s několika přechody mezi nimi.

  • Seznam oprávnění objektu. Tento druh oprávnění poskytuje velmi podrobné specifikace pro to, co je a není povoleno. Třída FileIOPermission je dobrým příkladem tohoto typu oprávnění, protože její stav je reprezentován seznamy souborů, ve kterých jsou povoleny určité typy přístupu. Oprávnění se seznamy jsou nejužitečnější pro ochranu prostředků, které obsahují velký počet pojmenovaných objektů.

Obecně je vhodné minimalizovat vnější závislosti ve své třídě vlastního oprávnění, protože všechna sestavení, na kterých závisí vaše oprávnění, budou muset být načteny, když systém zabezpečení potřebuje vaši třídu oprávnění. Pokud je to možné, měli byste umístit vaše třídy vlastního oprávnění a všech atributů přidružené v samostatných sestaveních, ke snížení pravděpodobnosti, že jiná sestavení budou načtena zbytečně.

Viz také

Koncepty

Vytvoření vlastního kódu přístupových oprávnění

Zabezpečení přístupu kódu