|
Spec-Zone .ru
спецификации, руководства, описания, API
|
public final class AccessController extends Object
AccessController class используется для операций управления доступом и решений.
Более определенно AccessController class используется в трех целях:
checkPermission метод определяет, нужно ли запрос доступа, обозначенный указанным разрешением, предоставить или отрицаться. Демонстрационный вызов появляется ниже. В этом примере, checkPermission определит, предоставить ли доступ "чтения" к файлу, названному "testFile" в "/временный" каталог.
FilePermission perm = new FilePermission("/temp/testFile", "read");
AccessController.checkPermission(perm);
Если запрошенный доступ позволяется, checkPermission возвраты спокойно. Если отрицающийся, AccessControlException бросается. AccessControlException может также быть брошен, если требуемое разрешение имеет неправильный тип или содержит недопустимое значение. Такая информация дается когда бы ни было возможно. Предположите текущий поток пересеченный м. вызывающих сторон в порядке вызывающей стороны 1 к вызывающей стороне 2 к вызывающей стороне м. Затем вызывающая сторона м. вызвала checkPermission метод. checkPermission метод определяет, предоставляется ли доступ или отрицается основанный на следующем алгоритме:
for (int i = m; i > 0; i--) {
if (caller i's domain does not have the permission)
throw AccessControlException
else if (caller i is marked as privileged) {
if (a context was specified in the call to doPrivileged)
context.checkPermission(permission)
return;
}
};
// Next, check the context inherited when the thread was created.
// Whenever a new thread is created, the AccessControlContext at
// that time is stored and associated with the new thread, as the
// "inherited" context.
inheritedContext.checkPermission(permission);
Вызывающая сторона может быть отмечена как "привилегированный" (см. doPrivileged и ниже). Принимая решения управления доступом, checkPermission метод прекращает проверять, достигает ли он вызывающей стороны, которая была отмечена как "привилегированный" через a doPrivileged вызовите без параметра контекста (см. ниже для информации о параметре контекста). Если у домена той вызывающей стороны есть указанное разрешение, никакая дальнейшая проверка не делается и checkPermission возвраты спокойно, указывая, что запрошенный доступ позволяется. Если у того домена нет указанного разрешения, исключение выдается, как обычно.
Нормальная эксплуатация "привилегированной" функции следующие. Если Вы не должны возвратить значение изнутри "привилегированного" блока, сделайте следующее:
somemethod() {
...normal code here...
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
// privileged code goes here, for example:
System.loadLibrary("awt");
return null; // nothing to return
}
});
...normal code here...
}
PrivilegedAction является интерфейсом с единственным методом, названным run. Вышеупомянутый пример показывает создание реализации того интерфейса; конкретная реализация run метод предоставляется. Когда звонок doPrivileged делается, экземпляр реализации PrivilegedAction передают к этому. doPrivileged вызовы метода run метод от реализации PrivilegedAction после включения полномочиям, и возвратам run возвращаемое значение метода как doPrivileged возвращаемое значение (который игнорируется в этом примере).
Если Вы должны возвратить значение, можно сделать что-то как следующее:
somemethod() {
...normal code here...
String user = AccessController.doPrivileged(
new PrivilegedAction<String>() {
public String run() {
return System.getProperty("user.name");
}
});
...normal code here...
}
Если действие, выполняемое в Вашем run метод мог выдать "проверенное" исключение (перечисленные в throws пункт метода), тогда Вы должны использовать PrivilegedExceptionAction интерфейс вместо PrivilegedAction интерфейс:
somemethod() throws FileNotFoundException {
...normal code here...
try {
FileInputStream fis = AccessController.doPrivileged(
new PrivilegedExceptionAction<FileInputStream>() {
public FileInputStream run() throws FileNotFoundException {
return new FileInputStream("someFile");
}
});
} catch (PrivilegedActionException e) {
// e.getException() should be an instance of FileNotFoundException,
// as only "checked" exceptions will be "wrapped" in a
// PrivilegedActionException.
throw (FileNotFoundException) e.getException();
}
...normal code here...
}
Будьте *very* осторожный в Вашем использовании "привилегированной" конструкции, и всегда не забывайте делать привилегированный раздел кода как можно меньше.
Отметьте это checkPermission всегда выполняет проверки безопасности в пределах контекста в настоящий момент выполняющегося потока. Иногда проверка защиты, которая должна быть сделана в пределах данного контекста, должна будет фактически быть сделана изнутри различного контекста (например изнутри рабочего потока). getContext метод и AccessControlContext class обеспечиваются для этой ситуации. getContext метод берет "снимок" текущего контекста вызова, и помещает его в объект AccessControlContext, который он возвращает. Демонстрационный вызов является следующим:
AccessControlContext acc = AccessController.getContext()
У самого AccessControlContext есть a checkPermission метод, который делает решения о предоставлении доступа основанными на контексте, который он инкапсулирует, а не тот из текущего потока выполнения. Код в пределах различного контекста может таким образом вызвать тот метод на ранее сохраненном объекте AccessControlContext. Демонстрационный вызов является следующим:
acc.checkPermission(permission)
Есть также времена, где Вы не знаете априорно который полномочия проверить контекст по. В этих случаях можно использовать doPrivileged метод, который берет контекст:
somemethod() {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
// Code goes here. Any permission checks within this
// run method will require that the intersection of the
// callers protection domain and the snapshot's
// context have the desired permission.
}
}, acc);
...normal code here...
}AccessControlContext| Модификатор и Тип | Метод и Описание |
|---|---|
static void |
checkPermission(Permission perm)
Определяет, должен ли запрос доступа, обозначенный указанным разрешением, быть позволен или отрицаться, основан на текущем AccessControlContext и политике безопасности.
|
static <T> T |
doPrivileged(PrivilegedAction<T> action)
Выполняет указанное
PrivilegedAction с включенными полномочиями. |
static <T> T |
doPrivileged(PrivilegedAction<T> action, AccessControlContext context)
Выполняет указанное
PrivilegedAction с полномочиями, включенными и ограниченными указанным AccessControlContext. |
static <T> T |
doPrivileged(PrivilegedExceptionAction<T> action)
Выполняет указанное
PrivilegedExceptionAction с включенными полномочиями. |
static <T> T |
doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context)
Выполняет указанное
PrivilegedExceptionAction с полномочиями, включенными и ограниченными указанным AccessControlContext. |
static <T> T |
doPrivilegedWithCombiner(PrivilegedAction<T> action)
Выполняет указанное
PrivilegedAction с включенными полномочиями. |
static <T> T |
doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action)
Выполняет указанное
PrivilegedExceptionAction с включенными полномочиями. |
static AccessControlContext |
getContext()
Этот метод берет "снимок" текущего контекста вызова, который включает текущий поток, наследовал AccessControlContext, и помещает это в объект AccessControlContext.
|
public static <T> T doPrivileged(PrivilegedAction<T> action)
PrivilegedAction с включенными полномочиями. Действие выполняется со всеми полномочиями, находившимися в собственности доменом защиты вызывающей стороны. Если действие run метод выдает исключение (непроверенное), он распространит через этот метод.
Отметьте, что любой DomainCombiner, связанный с текущим AccessControlContext, будет проигнорирован, в то время как действие выполняется.
action - действие, которое будет выполнено.run метод.NullPointerException - если действие nulldoPrivileged(PrivilegedAction,AccessControlContext), doPrivileged(PrivilegedExceptionAction), doPrivilegedWithCombiner(PrivilegedAction), DomainCombinerpublic static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action)
PrivilegedAction с включенными полномочиями. Действие выполняется со всеми полномочиями, находившимися в собственности доменом защиты вызывающей стороны. Если действие run метод выдает исключение (непроверенное), он распространит через этот метод.
Этот метод сохраняет DomainCombiner текущего AccessControlContext (который может быть нулем), в то время как действие выполняется.
action - действие, которое будет выполнено.run метод.NullPointerException - если действие nulldoPrivileged(PrivilegedAction), DomainCombinerpublic static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context)
PrivilegedAction с полномочиями, включенными и ограниченными указанным AccessControlContext. Действие выполняется с пересечением полномочий, находившихся в собственности доменом защиты вызывающей стороны, и одержимыми доменами, представленными указанным AccessControlContext. Если действие run метод выдает исключение (непроверенное), он распространит через этот метод.
action - действие, которое будет выполнено.context - контекст управления доступом, представляющий ограничение, которое будет применено к полномочиям домена вызывающей стороны прежде, чем выполнить указанное действие. Если контекст null, тогда никакое дополнительное ограничение не вводится.run метод.NullPointerException - если действие nulldoPrivileged(PrivilegedAction), doPrivileged(PrivilegedExceptionAction,AccessControlContext)public static <T> T doPrivileged(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
PrivilegedExceptionAction с включенными полномочиями. Действие выполняется со всеми полномочиями, находившимися в собственности доменом защиты вызывающей стороны. Если действие run метод выдает исключение непроверенное, он распространит через этот метод.
Отметьте, что любой DomainCombiner, связанный с текущим AccessControlContext, будет проигнорирован, в то время как действие выполняется.
action - действие, которое будет выполненоrun методPrivilegedActionException - если указанное действие run метод выдавал проверенное исключениеNullPointerException - если действие nulldoPrivileged(PrivilegedAction), doPrivileged(PrivilegedExceptionAction,AccessControlContext), doPrivilegedWithCombiner(PrivilegedExceptionAction), DomainCombinerpublic static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
PrivilegedExceptionAction с включенными полномочиями. Действие выполняется со всеми полномочиями, находившимися в собственности доменом защиты вызывающей стороны. Если действие run метод выдает исключение непроверенное, он распространит через этот метод.
Этот метод сохраняет DomainCombiner текущего AccessControlContext (который может быть нулем), в то время как действие выполняется.
action - действие, которое будет выполнено.run методPrivilegedActionException - если указанное действие run метод выдавал проверенное исключениеNullPointerException - если действие nulldoPrivileged(PrivilegedAction), doPrivileged(PrivilegedExceptionAction,AccessControlContext), DomainCombinerpublic static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context) throws PrivilegedActionException
PrivilegedExceptionAction с полномочиями, включенными и ограниченными указанным AccessControlContext. Действие выполняется с пересечением полномочий, находившихся в собственности доменом защиты вызывающей стороны, и одержимыми доменами, представленными указанным AccessControlContext. Если действие run метод выдает исключение непроверенное, он распространит через этот метод.
action - действие, которое будет выполненоcontext - контекст управления доступом, представляющий ограничение, которое будет применено к полномочиям домена вызывающей стороны прежде, чем выполнить указанное действие. Если контекст null, тогда никакое дополнительное ограничение не вводится.run методPrivilegedActionException - если указанное действие run метод выдавал проверенное исключениеNullPointerException - если действие nulldoPrivileged(PrivilegedAction), doPrivileged(PrivilegedExceptionAction,AccessControlContext)public static AccessControlContext getContext()
AccessControlContextpublic static void checkPermission(Permission perm) throws AccessControlException
perm Экземпляр объекта полномочий.perm - требуемое разрешение.AccessControlException - если указанное разрешение не разрешается, не основано на текущей политике безопасности.NullPointerException - если указанное разрешение null и проверяется основанный на политике безопасности в настоящий момент в действительности.
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92