Разрешение принципала
Безопасность на основе ролей управляется классом PrincipalPermission. Пример под тем же названием проверяет с помощью этого класса, что личность пользователя, под которой запускается программа, – это Administrator (Администратор). Мы это делаем, передавая конструктору имя личности и строку, представляющую роль. И снова для разрешения мы применяем метод Demand (Требование), чтобы проверить законность запроса на разрешение.
// Требовать, чтобы код выполнял Администратор PrincipalPermission *pperm = new PrincipalPermission( wi › Name, adminRole); // Имя try { pperm › Demand(); Console::WriteLine( "Code demand for an administrator succeeded."); // "Запрос кода для Администратора успешный." } catch(SecurityException *) { Console::WriteLine( "Demand for Administrator failed."); // "Запрос для Администратора потерпел неудачу." }
Если программу запустил администратор, то требование успешно удовлетворяется. В противном случае оно не удовлетворяется и запускается исключение. Затем код проверяет, является ли именем пользователя JaneAdmin (это имя не системного администратора, и оно всего лишь входит в группу Customer Admin), и что указанная роль выполняет программу.
String *customerAdminRole = // Строка "HPDESKTOP\\CustomerAdmin"; PrincipalPermission *pp; pp = new PrincipalPermission( "HPDESKTOP\\JaneAdmin", customerAdminRole); try { pp › Demand(); Console::WriteLine( "Demand for Customer Administrator succeeded."); // "Запрос для Администратора клиентов успешный." } catch(SecurityException *) { Console::WriteLine( "Demand for Customer Administrator failed."); // "Запрос для Администратора клиентов потерпел неудачу." }
В базовом классе CodeAccessPermission имеются методы создания разрешений, представляющих собой объединение или пересечение нескольких разрешений. Класс PrincipalPermission не является производным от CodeAccessPermission, потому что он работает на основе личности, связанной с кодом, а не с правами на код. Но как бы там ни было, он использует те же идиомы, что и классы, производные от CodeAccessPermission.
Ниже приведен пример кода, проверяющего, запустила ли его одна из двух указанных личностей администраторов.
String *idl = "HPDESKTOP\\Administrator"; // Администратор String *id2 = "HPDESKTOP\\PeterT"; // Строка PrincipalPermission *ppl = new PrincipalPermission(idl, adminRole); PrincipalPermission *pp2 = new PrincipalPermission(id2, adminRole); IPermission *ipermission = pp2 › Union(ppl); // Объединение – try { ipermission › Demand(); Console::WriteLine( "Demand for either administrator succeeded."); // "Запрос для любого из администраторов успешный." } catch(SecurityException *) { Console::WriteLine ( "Demand for either administrator failed."); // "Запрос для любого из администраторов потерпел неудачу." }
Затем код смотрит, запущен ли он личностью любого из администраторов.
Principal-Permission *pp3 = new PrincipalPermission(0, adminRole); try { pp3 › Demand(); Console::WriteLine( "Demand for any administrator succeeded."); // "Запрос для любого администратора успешный." } catch(SecurityException *) { Console::WriteLine( "Demand for any administrator failed."); // "Запрос для любого администратора потерпел неудачу." }
Когда пользователи не аутентифицированы, то даже если они действительно принадлежат соответствующим ролям, выполнение Demand (Требование) все равно будет неудачным.