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
- если действие null
doPrivileged(PrivilegedAction,AccessControlContext)
, doPrivileged(PrivilegedExceptionAction)
, doPrivilegedWithCombiner(PrivilegedAction)
, DomainCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action)
PrivilegedAction
с включенными полномочиями. Действие выполняется со всеми полномочиями, находившимися в собственности доменом защиты вызывающей стороны. Если действие run
метод выдает исключение (непроверенное), он распространит через этот метод.
Этот метод сохраняет DomainCombiner текущего AccessControlContext (который может быть нулем), в то время как действие выполняется.
action
- действие, которое будет выполнено.run
метод.NullPointerException
- если действие null
doPrivileged(PrivilegedAction)
, DomainCombiner
public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context)
PrivilegedAction
с полномочиями, включенными и ограниченными указанным AccessControlContext
. Действие выполняется с пересечением полномочий, находившихся в собственности доменом защиты вызывающей стороны, и одержимыми доменами, представленными указанным AccessControlContext
. Если действие run
метод выдает исключение (непроверенное), он распространит через этот метод.
action
- действие, которое будет выполнено.context
- контекст управления доступом, представляющий ограничение, которое будет применено к полномочиям домена вызывающей стороны прежде, чем выполнить указанное действие. Если контекст null
, тогда никакое дополнительное ограничение не вводится.run
метод.NullPointerException
- если действие null
doPrivileged(PrivilegedAction)
, doPrivileged(PrivilegedExceptionAction,AccessControlContext)
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
PrivilegedExceptionAction
с включенными полномочиями. Действие выполняется со всеми полномочиями, находившимися в собственности доменом защиты вызывающей стороны. Если действие run
метод выдает исключение непроверенное, он распространит через этот метод.
Отметьте, что любой DomainCombiner, связанный с текущим AccessControlContext, будет проигнорирован, в то время как действие выполняется.
action
- действие, которое будет выполненоrun
методPrivilegedActionException
- если указанное действие run
метод выдавал проверенное исключениеNullPointerException
- если действие null
doPrivileged(PrivilegedAction)
, doPrivileged(PrivilegedExceptionAction,AccessControlContext)
, doPrivilegedWithCombiner(PrivilegedExceptionAction)
, DomainCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
PrivilegedExceptionAction
с включенными полномочиями. Действие выполняется со всеми полномочиями, находившимися в собственности доменом защиты вызывающей стороны. Если действие run
метод выдает исключение непроверенное, он распространит через этот метод.
Этот метод сохраняет DomainCombiner текущего AccessControlContext (который может быть нулем), в то время как действие выполняется.
action
- действие, которое будет выполнено.run
методPrivilegedActionException
- если указанное действие run
метод выдавал проверенное исключениеNullPointerException
- если действие null
doPrivileged(PrivilegedAction)
, doPrivileged(PrivilegedExceptionAction,AccessControlContext)
, DomainCombiner
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context) throws PrivilegedActionException
PrivilegedExceptionAction
с полномочиями, включенными и ограниченными указанным AccessControlContext
. Действие выполняется с пересечением полномочий, находившихся в собственности доменом защиты вызывающей стороны, и одержимыми доменами, представленными указанным AccessControlContext
. Если действие run
метод выдает исключение непроверенное, он распространит через этот метод.
action
- действие, которое будет выполненоcontext
- контекст управления доступом, представляющий ограничение, которое будет применено к полномочиям домена вызывающей стороны прежде, чем выполнить указанное действие. Если контекст null
, тогда никакое дополнительное ограничение не вводится.run
методPrivilegedActionException
- если указанное действие run
метод выдавал проверенное исключениеNullPointerException
- если действие null
doPrivileged(PrivilegedAction)
, doPrivileged(PrivilegedExceptionAction,AccessControlContext)
public static AccessControlContext getContext()
AccessControlContext
public static void checkPermission(Permission perm) throws AccessControlException
perm
Экземпляр объекта полномочий.perm
- требуемое разрешение.AccessControlException
- если указанное разрешение не разрешается, не основано на текущей политике безопасности.NullPointerException
- если указанное разрешение null
и проверяется основанный на политике безопасности в настоящий момент в действительности.
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92