Класс AccessController
- java.lang.Object
-
- java.security.AccessController
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.
- C момента:
- 1.2
- См. также:
AccessControlContext
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
static void | checkPermission(Permission perm) | Определяет, следует ли разрешить или запретить запрос доступа, указанный заданным разрешением, на основе текущего AccessControlContext и политики безопасности. |
static <T> T | doPrivileged(PrivilegedAction<T> action) | Выполняет указанное |
static <T> T | doPrivileged(PrivilegedAction<T> action,
AccessControlContext context) | Выполняет указанное |
static <T> T | doPrivileged(PrivilegedAction<T> action,
AccessControlContext context,
Permission... perms) | Выполняет указанное |
static <T> T | doPrivileged(PrivilegedExceptionAction<T> action) | Выполняет указанное |
static <T> T | doPrivileged(PrivilegedExceptionAction<T> action,
AccessControlContext context) | Выполняет указанное |
static <T> T | doPrivileged(PrivilegedExceptionAction<T> action,
AccessControlContext context,
Permission... perms) | Выполняет указанное |
static <T> T | doPrivilegedWithCombiner(PrivilegedAction<T> action) | Выполняет указанное |
static <T> T | doPrivilegedWithCombiner(PrivilegedAction<T> action,
AccessControlContext context,
Permission... perms) | Выполняет указанное |
static <T> T | doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action) | Выполняет указанное |
static <T> T | doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action,
AccessControlContext context,
Permission... perms) | Выполняет указанное |
static AccessControlContext | getContext() | Этот метод делает «мгновенный снимок» текущего контекста вызова, который включает текущий AccessControlContext, унаследованный потоком, и любую ограниченную область привилегий, и помещает его в объект AccessControlContext. |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Методы
doPrivileged
public static <T> T doPrivileged(PrivilegedAction<T> action)
Выполняет указанное PrivilegedAction с включенными привилегиями. Действие выполняется со всеми разрешениями, имеющимися в области защиты вызывающего объекта.
Если метод действия run генерирует (непроверяемое) исключение, оно будет распространено через этот метод.
Обратите внимание, что любой DomainCombiner, связанный с текущим AccessControlContext, будет проигнорирован во время выполнения действия.
- Параметры типа:
-
T- тип значения, возвращаемого методомrunPrivilegedAction. - Параметры:
-
action- выполняемое действие. - Возвращаемое значение:
- значение, возвращенное методом
runдействия. - Исключения:
-
NullPointerException- если действиеnull - См. также:
-
doPrivileged(PrivilegedAction,AccessControlContext),doPrivileged(PrivilegedExceptionAction),doPrivilegedWithCombiner(PrivilegedAction),DomainCombiner
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action)
Выполняет указанное PrivilegedAction с включенными привилегиями. Действие выполняется со всеми разрешениями, имеющимися в области защиты вызывающего объекта.
Если метод действия run генерирует (непроверяемое) исключение, оно будет распространено через этот метод.
Этот метод сохраняет текущий DomainCombiner AccessControlContext (который может быть null) во время выполнения действия.
- Параметры типа:
-
T- тип значения, возвращаемого методомrunPrivilegedAction. - Параметры:
-
action- выполняемое действие. - Возвращаемое значение:
- значение, возвращенное методом
runдействия. - Исключения:
-
NullPointerException- если действиеnull - С:
- 1.6
- См. также:
-
doPrivileged(PrivilegedAction),DomainCombiner
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(PrivilegedAction),doPrivileged(PrivilegedExceptionAction,AccessControlContext)
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
- См. также:
-
doPrivileged(PrivilegedAction),doPrivileged(PrivilegedExceptionAction,AccessControlContext)
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(PrivilegedAction),doPrivileged(PrivilegedExceptionAction,AccessControlContext),DomainCombiner
doPrivileged
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action)
throws PrivilegedActionException Выполняет указанное PrivilegedExceptionAction с включенными привилегиями. Действие выполняется со всеми разрешениями, имеющимися в области защиты вызывающего объекта.
Если метод действия run генерирует непроверяемое исключение, оно будет распространено через этот метод.
Обратите внимание, что любой DomainCombiner, связанный с текущим AccessControlContext, будет проигнорирован во время выполнения действия.
- Параметры типа:
-
T- тип значения, возвращаемого методомrunPrivilegedExceptionAction. - Параметры:
-
action- выполняемое действие - Возвращаемое значение:
- значение, возвращенное методом
runдействия - Исключения:
-
PrivilegedActionException- если методrunуказанного действия сгенерировал проверяемое исключение -
NullPointerException- если действиеnull - См. также:
-
doPrivileged(PrivilegedAction),doPrivileged(PrivilegedExceptionAction,AccessControlContext),doPrivilegedWithCombiner(PrivilegedExceptionAction),DomainCombiner
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action)
throws PrivilegedActionException Выполняет указанное PrivilegedExceptionAction с включенными привилегиями. Действие выполняется со всеми разрешениями, имеющимися в области защиты вызывающего объекта.
Если метод действия run генерирует непроверяемое исключение, оно будет распространено через этот метод.
Этот метод сохраняет текущий DomainCombiner AccessControlContext (который может быть null) во время выполнения действия.
- Параметры типа:
-
T- тип значения, возвращаемого методомrunPrivilegedExceptionAction. - Параметры:
-
action- действие, подлежащее выполнению. - Возвращаемое значение:
- значение, возвращаемое методом
runдействия. - Исключения:
-
PrivilegedActionException- если методrunуказанного действия бросил обрабатываемое исключение. -
NullPointerException- если действие являетсяnull - С тех пор:
- 1.6
- См. также:
-
doPrivileged(PrivilegedAction),doPrivileged(PrivilegedExceptionAction,AccessControlContext),DomainCombiner
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(PrivilegedAction),doPrivileged(PrivilegedAction,AccessControlContext)
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, или любой элемент perms являетсяnull - С тех пор:
- 1.8
- См. также:
-
doPrivileged(PrivilegedAction),doPrivileged(PrivilegedAction,AccessControlContext)
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action,
AccessControlContext context,
Permission... perms)
throws PrivilegedActionException Выполняет указанное PrivilegedExceptionAction с включенными привилегиями и ограничениями, заданными указанным AccessControlContext, и с областью привилегий, ограниченной указанными Permission аргументами. Действие выполняется с пересечением разрешений, имеющихся в области защиты вызывающего элемента, и разрешений, имеющихся в областях, представленных указанным AccessControlContext.
Если метод run действия выбрасывает (необрабатываемое) исключение, оно будет проходить через этот метод.
Этот метод сохраняет текущий DomainCombiner контекста AccessControlContext (который может быть null) во время выполнения действия.
Если установлен менеджер безопасности, и указанный AccessControlContext не был создан системным кодом, и вызывающему элементу не предоставлено разрешение «createAccessControlContext» SecurityPermission, то действие выполняется без разрешений.
- Параметры типа:
-
T- тип значения, возвращаемого методомrunPrivilegedExceptionAction. - Параметры:
-
action- действие, подлежащее выполнению. -
context- контекст управления доступом, представляющий ограничение, применяемое к привилегиям области вызывающего элемента перед выполнением указанного действия. Если контекст являетсяnull, дополнительное ограничение не применяется. -
perms- аргументыPermission, которые ограничивают область привилегий вызывающего элемента. Количество аргументов переменное. - Возвращаемое значение:
- значение, возвращаемое методом
runдействия. - Исключения:
-
PrivilegedActionException- если методrunуказанного действия бросил обрабатываемое исключение. -
NullPointerException- если действие, или perms, или любой элемент perms являетсяnull - С тех пор:
- 1.8
- См. также:
-
doPrivileged(PrivilegedAction),doPrivileged(PrivilegedAction,AccessControlContext),DomainCombiner
getContext
public static AccessControlContext getContext()
Этот метод создаёт «моментальный снимок» текущего контекста вызова, который включает текущий контекст AccessControlContext унаследованный потоком и любую ограниченную область привилегий, и помещает его в объект AccessControlContext. Этот контекст может быть затем проверен в более поздней точке, возможно, в другом потоке.
- Возвращаемое значение:
- AccessControlContext, основанный на текущем контексте.
- См. также:
AccessControlContext
checkPermission
public static void checkPermission(Permission perm)
throws AccessControlException Определяет, следует ли разрешить или отклонить запрос доступа, указанный заданным разрешением, на основе текущего AccessControlContext и политики безопасности. Этот метод безмолвно возвращается, если запрос доступа разрешён, или иначе выбрасывает AccessControlException. Метод getPermission исключения AccessControlException возвращает экземпляр объекта Permission perm.
- Параметры:
-
perm- запрашиваемое разрешение. - Исключения:
-
AccessControlException- если указанное разрешение не разрешено на основе текущей политики безопасности. -
NullPointerException- если указанное разрешение являетсяnullи проверяется на основе текущей политики безопасности.
© 1993, 2020, 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/11/docs/api/java.base/java/security/AccessController.html