Класс AccessController
@Deprecated(since="17", forRemoval=true) public final class AccessController extends Object
Класс AccessController используется для операций и решений по управлению доступом.
Более конкретно, класс AccessController используется для трёх целей:
- определение, разрешить или запретить доступ к критической системе ресурсов, основываясь на действующей политике безопасности,
- пометить код как «привилегированный», тем самым повлиять на последующие решения по доступу, и
- получение «моментального снимка» текущего контекста вызова для принятия решений о доступе из другого контекста с учётом сохранённого контекста.
Метод checkPermission определяет, должно ли быть предоставлено или отказано в доступе в соответствии с запросом, указанным заданной разрешительной строкой. Пример вызова показан ниже. В этом примере checkPermission определит, разрешить ли «чтение» файла с именем «testFile» в каталоге «/temp».
FilePermission perm = new FilePermission("/temp/testFile", "read");
AccessController.checkPermission(perm);
Если запрашиваемый доступ разрешён, checkPermission возвращается без действий. Если он запрещён, выбрасывается исключение AccessControlException. AccessControlException также может быть выброшено, если запрашиваемая разрешительная строка имеет неправильный тип или содержит недопустимое значение. Такая информация предоставляется всякий раз, когда это возможно. Предположим, что текущий поток прошёл через m вызывающих объектов в порядке от вызывающего объекта 1 до вызывающего объекта 2 до вызывающего объекта m. Затем вызывающий объект m вызвал метод 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)
if (limited permissions were specified in the call to doPrivileged) {
for (each limited permission) {
if (the limited permission implies the requested permission)
return;
}
} else
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 прекращает проверку, если достигает вызывающего объекта, который был помечен как «привилегированный» с помощью вызова doPrivileged без аргумента контекста (см. ниже информацию об аргументе контекста). Если область вызывающего объекта имеет указанную разрешительную строку и по крайней мере один аргумент ограничивающей разрешительной строки (если таковой имеется) подразумевает запрашиваемую разрешительную строку, дальнейшая проверка не выполняется и checkPermission возвращается без действий, указывая, что запрашиваемый доступ разрешён. Если у области вызывающего объекта нет указанной разрешительной строки, выбрасывается исключение, как обычно. Если у области вызывающего объекта была указанная разрешительная строка, но она не подразумевалась никакими аргументами ограничивающей разрешительной строки, переданными в вызов doPrivileged, проверка разрешений продолжается до тех пор, пока не останется больше вызывающих объектов или другой вызов doPrivileged не соответствует запрашиваемой разрешительной строке и не вернётся без ошибок.
Обычное использование функции «привилегий» следующее. Если вам не нужно возвращать значение из блока «привилегий», сделайте следующее:
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...
} Будьте *очень* внимательны при использовании конструкции «привилегии» и всегда помните, чтобы сделать раздел привилегированного кода как можно меньше. Вы можете передать Permission аргументы, чтобы дополнительно ограничить область «привилегии» (см. ниже).
Обратите внимание, что checkPermission всегда выполняет проверки безопасности в контексте текущего потока. Иногда проверка безопасности, которая должна выполняться в заданном контексте, фактически должна выполняться в другом контексте (например, в потоке обработки). Для этой ситуации предоставляются метод getContext и класс AccessControlContext. Метод getContext создаёт «моментальный снимок» текущего контекста вызова и помещает его в объект AccessControlContext, который он возвращает. Пример вызова:
AccessControlContext acc = AccessController.getContext()
Сам AccessControlContext имеет метод checkPermission, который принимает решения о доступе, основанные на контексте, который он оборачивает, а не на контексте текущего потока. Код в другом контексте может, таким образом, вызвать этот метод в объекте ранее сохранённого AccessControlContext. Пример вызова:
acc.checkPermission(permission)
Иногда вы не знаете заранее, какие разрешения следует проверить в контексте. В таких случаях вы можете использовать метод doPrivileged, который принимает контекст. Вы также можете ограничить область привилегированного кода, передавая дополнительные Permission параметры.
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
// caller's protection domain and the snapshot's
// context have the desired permission. If a requested
// permission is not implied by the limiting FilePermission
// argument then checking of the thread continues beyond the
// caller of doPrivileged.
}
}, acc, new FilePermission("/temp/*", read));
...normal code here...
} Передача ограничивающего Permission аргумента экземпляра AllPermission эквивалентна вызову эквивалентного метода doPrivileged без ограничивающих Permission аргументов. Передача массива нулевой длины Permission отключает привилегии кода, так что проверка всегда продолжается за пределами вызывающего объекта данного метода doPrivileged.
- С:
- 1.2
- См. также:
Краткое описание методов
| Modifier and Type | Method | Description |
|---|---|---|
static void |
checkPermission |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Определяет, следует ли разрешить или запретить запрос доступа, указанный указанным разрешением, на основе текущего AccessControlContext и политики безопасности. |
static <T> T |
doPrivileged |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Выполняет указанное PrivilegedAction с разрешениями, включенными. |
static <T> T |
doPrivileged |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Выполняет указанное PrivilegedAction с разрешениями, включенными и ограниченными указанным AccessControlContext. |
static <T> T |
doPrivileged |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Выполняет указанное PrivilegedAction с разрешениями, включенными и ограниченными указанным AccessControlContext и с областью разрешений, ограниченной указанными Permission аргументами. |
static <T> T |
doPrivileged |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Выполняет указанное PrivilegedExceptionAction с разрешениями, включенными. |
static <T> T |
doPrivileged |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Выполняет указанное PrivilegedExceptionAction с разрешениями, включенными и ограниченными указанным AccessControlContext. |
static <T> T |
doPrivileged |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Выполняет указанное PrivilegedExceptionAction с разрешениями, включенными и ограниченными указанным AccessControlContext и с областью разрешений, ограниченной указанными Permission аргументами. |
static <T> T |
doPrivilegedWithCombiner |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Выполняет указанное PrivilegedAction с разрешениями, включенными. |
static <T> T |
doPrivilegedWithCombiner |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Выполняет указанное PrivilegedAction с разрешениями, включенными и ограниченными указанным AccessControlContext и с областью разрешений, ограниченной указанными Permission аргументами. |
static <T> T |
doPrivilegedWithCombiner |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Выполняет указанное PrivilegedExceptionAction с разрешениями, включенными. |
static <T> T |
doPrivilegedWithCombiner |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Выполняет указанное PrivilegedExceptionAction с разрешениями, включенными и ограниченными указанным AccessControlContext и с областью разрешений, ограниченной указанными Permission аргументами. |
static AccessControlContext |
getContext() |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Этот метод создает "снимок" текущего контекста вызова, который включает текущий AccessControlContext, унаследованный потоком, и любые ограниченные области разрешений, и помещает его в объект AccessControlContext. |
Подробное описание методов
doPrivileged
public static <T> T doPrivileged(PrivilegedAction<T> action)
PrivilegedAction с включенными привилегиями. Действие выполняется со всеми разрешениями, имеющимися в области защиты вызывающего объекта. Если метод действия run вызывает исключение (непроверяемое), оно будет распространено через этот метод.
Обратите внимание, что любой DomainCombiner, связанный с текущим AccessControlContext, будет проигнорирован во время выполнения действия.
- Тип параметров:
-
T- тип значения, возвращаемого методомrunPrivilegedAction. - Параметры:
-
action- действие, подлежащее выполнению. - Возвращает:
- значение, возвращаемое методом
runдействия. - Исключения:
-
NullPointerException- если действиеnull - См. также:
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action)
PrivilegedAction с включенными привилегиями. Действие выполняется со всеми разрешениями, имеющимися в области защиты вызывающего объекта. Если метод действия run вызывает исключение (непроверяемое), оно будет распространено через этот метод.
Этот метод сохраняет текущий DomainCombiner AccessControlContext (который может быть null) во время выполнения действия.
- Тип параметров:
-
T- тип значения, возвращаемого методомrunPrivilegedAction. - Параметры:
-
action- действие, подлежащее выполнению. - Возвращает:
- значение, возвращаемое методом
runдействия. - Исключения:
-
NullPointerException- если действиеnull - С:
- 1.6
- См. также:
doPrivileged
public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context)
PrivilegedAction с включенными привилегиями и ограниченными указанным AccessControlContext. Действие выполняется с пересечением разрешений, имеющихся в области защиты вызывающего объекта, и разрешений, имеющихся в областях, представленных указанным AccessControlContext. Если метод действия run вызывает исключение (непроверяемое), оно будет распространено через этот метод.
Если установлен менеджер безопасности и указанный AccessControlContext не был создан системным кодом, и вызывающему объекту не предоставлено разрешение «createAccessControlContext» SecurityPermission, действие выполняется без разрешений.
- Тип параметров:
-
T- тип значения, возвращаемого методомrunPrivilegedAction. - Параметры:
-
action- действие, подлежащее выполнению. -
context- контекст управления доступом, представляющий ограничение, которое должно быть применено к привилегиям области вызывающего объекта перед выполнением указанного действия. Если контекстnull, дополнительное ограничение не применяется. - Возвращает:
- значение, возвращаемое методом
runдействия. - Исключения:
-
NullPointerException- если действиеnull - См. также:
doPrivileged
public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)
PrivilegedAction с включенными привилегиями и ограниченными указанным AccessControlContext и с областью привилегий, ограниченной указанными Permission аргументами. Действие выполняется с пересечением разрешений, имеющихся в области защиты вызывающего объекта, и разрешений, имеющихся в областях, представленных указанным AccessControlContext. Если метод действия run вызывает исключение (непроверяемое), оно будет распространено через этот метод.
Если установлен менеджер безопасности и указанный AccessControlContext не был создан системным кодом, и вызывающему объекту не предоставлено разрешение «createAccessControlContext» SecurityPermission, действие выполняется без разрешений.
- Тип параметров:
-
T- тип значения, возвращаемого методомrunPrivilegedAction. - Параметры:
-
action- действие, подлежащее выполнению. -
context- контекст управления доступом, представляющий ограничение, которое должно быть применено к привилегиям области вызывающего объекта перед выполнением указанного действия. Если контекстnull, дополнительное ограничение не применяется. -
perms-Permissionаргументы, которые ограничивают область привилегий вызывающего объекта. Количество аргументов переменное. - Возвращает:
- значение, возвращаемое методом
runдействия. - Исключения:
-
NullPointerException- если действие или разрешения или любой элемент разрешенийnull - С:
- 1.8
- См. также:
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)
PrivilegedAction с включенными привилегиями и ограниченными указанным AccessControlContext и с областью привилегий, ограниченной указанными Permission аргументами. Действие выполняется с пересечением разрешений, имеющихся в области защиты вызывающего объекта, и разрешений, имеющихся в областях, представленных указанным AccessControlContext. Если метод действия run вызывает исключение (непроверяемое), оно будет распространено через этот метод.
Этот метод сохраняет текущий DomainCombiner AccessControlContext (который может быть null) во время выполнения действия.
Если установлен менеджер безопасности и указанный AccessControlContext не был создан системным кодом, и вызывающему объекту не предоставлено разрешение «createAccessControlContext» SecurityPermission, действие выполняется без разрешений.
- Тип параметров:
-
T- тип значения, возвращаемого методомrunPrivilegedAction. - Параметры:
-
action- действие, подлежащее выполнению. -
context- контекст управления доступом, представляющий ограничение, которое должно быть применено к привилегиям области вызывающего объекта перед выполнением указанного действия. Если контекстnull, дополнительное ограничение не применяется. -
perms-Permissionаргументы, которые ограничивают область привилегий вызывающего объекта. Количество аргументов переменное. - Возвращает:
- значение, возвращаемое методом
runдействия. - Исключения:
-
NullPointerException- если действие или разрешения или любой элемент разрешенийnull - С:
- 1.8
- См. также:
doPrivileged
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
PrivilegedExceptionAction с включенными привилегиями. Действие выполняется со всеми разрешениями, имеющимися в области защиты вызывающего объекта. Если метод действия run вызывает исключение, не требующее проверки, оно будет распространено через этот метод.
Обратите внимание, что любой DomainCombiner, связанный с текущим AccessControlContext, будет проигнорирован во время выполнения действия.
- Параметры типа:
-
T- тип значения, возвращаемого методомrunPrivilegedExceptionAction. - Параметры:
-
action- действие, подлежащее выполнению - Возвращает:
- значение, возвращаемое методом
runдействия - Исключения:
-
PrivilegedActionException- если методrunуказанного действия вызвал исключение, требующее проверки -
NullPointerException- если действиеnull - См. также:
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
PrivilegedExceptionAction с включенными привилегиями. Действие выполняется со всеми разрешениями, имеющимися в области защиты вызывающего объекта. Если метод действия run вызывает исключение, не требующее проверки, оно будет распространено через этот метод.
Этот метод сохраняет текущий DomainCombiner AccessControlContext (который может быть нулевым) во время выполнения действия.
- Параметры типа:
-
T- тип значения, возвращаемого методомrunPrivilegedExceptionAction. - Параметры:
-
action- действие, подлежащее выполнению. - Возвращает:
- значение, возвращаемое методом
runдействия - Исключения:
-
PrivilegedActionException- если методrunуказанного действия вызвал исключение, требующее проверки -
NullPointerException- если действиеnull - С тех пор:
- 1.6
- См. также:
doPrivileged
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context) throws PrivilegedActionException
PrivilegedExceptionAction с включенными привилегиями и ограничениями, заданными указанным AccessControlContext. Действие выполняется с пересечением разрешений, имеющихся в области защиты вызывающего объекта, и разрешений, имеющихся в областях, представленных указанным AccessControlContext. Если метод действия run вызывает исключение, не требующее проверки, оно будет распространено через этот метод.
Если установлена система безопасности и указанный AccessControlContext не создан системным кодом, и вызывающему объекту не предоставлено разрешение "createAccessControlContext" SecurityPermission, то действие выполняется без разрешений.
- Параметры типа:
-
T- тип значения, возвращаемого методомrunPrivilegedExceptionAction. - Параметры:
-
action- действие, подлежащее выполнению -
context- контекст управления доступом, представляющий собой ограничение, применяемое к привилегиям области защиты вызывающего объекта перед выполнением указанного действия. Если контекстnull, то дополнительное ограничение не применяется. - Возвращает:
- значение, возвращаемое методом
runдействия - Исключения:
-
PrivilegedActionException- если методrunуказанного действия вызвал исключение, требующее проверки -
NullPointerException- если действиеnull - См. также:
doPrivileged
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) throws PrivilegedActionException
PrivilegedExceptionAction с включенными привилегиями и ограничениями, заданными указанным AccessControlContext и с областью привилегий, ограниченной указанными Permission аргументами. Действие выполняется с пересечением разрешений, имеющихся в области защиты вызывающего объекта, и разрешений, имеющихся в областях, представленных указанным AccessControlContext. Если метод действия run вызывает (не требующее проверки) исключение, оно будет распространено через этот метод.
Если установлена система безопасности и указанный AccessControlContext не создан системным кодом, и вызывающему объекту не предоставлено разрешение "createAccessControlContext" SecurityPermission, то действие выполняется без разрешений.
- Параметры типа:
-
T- тип значения, возвращаемого методомrunPrivilegedExceptionAction. - Параметры:
-
action- действие, подлежащее выполнению. -
context- контекст управления доступом, представляющий собой ограничение, применяемое к привилегиям области защиты вызывающего объекта перед выполнением указанного действия. Если контекстnull, то дополнительное ограничение не применяется. -
perms-Permissionаргументы, которые ограничивают область действия привилегий вызывающего объекта. Количество аргументов может меняться. - Возвращает:
- значение, возвращаемое методом
runдействия. - Исключения:
-
PrivilegedActionException- если методrunуказанного действия вызвал исключение, требующее проверки -
NullPointerException- если действие или perms или любой элемент permsnull - С тех пор:
- 1.8
- См. также:
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) throws PrivilegedActionException
PrivilegedExceptionAction с включенными привилегиями и ограничениями, заданными указанным AccessControlContext и с областью привилегий, ограниченной указанными Permission аргументами. Действие выполняется с пересечением разрешений, имеющихся в области защиты вызывающего объекта, и разрешений, имеющихся в областях, представленных указанным AccessControlContext. Если метод действия run вызывает (не требующее проверки) исключение, оно будет распространено через этот метод.
Этот метод сохраняет текущий DomainCombiner AccessControlContext (который может быть нулевым) во время выполнения действия.
Если установлена система безопасности и указанный AccessControlContext не создан системным кодом, и вызывающему объекту не предоставлено разрешение "createAccessControlContext" SecurityPermission, то действие выполняется без разрешений.
- Параметры типа:
-
T- тип значения, возвращаемого методомrunPrivilegedExceptionAction. - Параметры:
-
action- действие, подлежащее выполнению. -
context- контекст управления доступом, представляющий собой ограничение, применяемое к привилегиям области защиты вызывающего объекта перед выполнением указанного действия. Если контекстnull, то дополнительное ограничение не применяется. -
perms-Permissionаргументы, которые ограничивают область действия привилегий вызывающего объекта. Количество аргументов может меняться. - Возвращает:
- значение, возвращаемое методом
runдействия. - Исключения:
-
PrivilegedActionException- если методrunуказанного действия вызвал исключение, требующее проверки -
NullPointerException- если действие или perms или любой элемент permsnull - С тех пор:
- 1.8
- См. также:
getContext
public static AccessControlContext getContext()
- Возвращает:
- AccessControlContext, основанный на текущем контексте.
- См. также:
checkPermission
public static void checkPermission(Permission perm) throws AccessControlException
perm. - Параметры:
-
perm- запрашиваемое разрешение. - Исключения:
-
AccessControlException- если указанное разрешение не разрешено, на основе текущей политики безопасности. -
NullPointerException- если указанное разрешениеnullи проверяется на основе действующей политики безопасности.
© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/security/AccessController.html