Класс 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)

Выполняет указанное PrivilegedAction с включёнными привилегиями.

static <T> T doPrivileged​(PrivilegedAction<T> action, AccessControlContext context)

Выполняет указанное PrivilegedAction с включёнными привилегиями и ограниченными указанными AccessControlContext.

static <T> T doPrivileged​(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)

Выполняет указанное PrivilegedAction с включёнными привилегиями и ограниченными указанными AccessControlContext и с ограниченной областью привилегий заданными Permission аргументами.

static <T> T doPrivileged​(PrivilegedExceptionAction<T> action)

Выполняет указанное PrivilegedExceptionAction с включёнными привилегиями.

static <T> T doPrivileged​(PrivilegedExceptionAction<T> action, AccessControlContext context)

Выполняет указанное PrivilegedExceptionAction с включёнными привилегиями и ограниченными указанными AccessControlContext.

static <T> T doPrivileged​(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms)

Выполняет указанное PrivilegedExceptionAction с включёнными привилегиями и ограниченными указанными AccessControlContext и с ограниченной областью привилегий заданными Permission аргументами.

static <T> T doPrivilegedWithCombiner​(PrivilegedAction<T> action)

Выполняет указанное PrivilegedAction с включёнными привилегиями.

static <T> T doPrivilegedWithCombiner​(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)

Выполняет указанное PrivilegedAction с включёнными привилегиями и ограниченными указанными AccessControlContext и с ограниченной областью привилегий заданными Permission аргументами.

static <T> T doPrivilegedWithCombiner​(PrivilegedExceptionAction<T> action)

Выполняет указанное PrivilegedExceptionAction с включёнными привилегиями.

static <T> T doPrivilegedWithCombiner​(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms)

Выполняет указанное PrivilegedExceptionAction с включёнными привилегиями и ограниченными указанными AccessControlContext и с ограниченной областью привилегий заданными Permission аргументами.

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 - тип значения, возвращаемого методом run PrivilegedAction.
Параметры:
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 - тип значения, возвращаемого методом run PrivilegedAction.
Параметры:
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 - тип значения, возвращаемого методом run PrivilegedAction.
Параметры:
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 - тип значения, возвращаемого методом run PrivilegedAction.
Параметры:
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 - тип значения, возвращаемого методом run PrivilegedAction.
Параметры:
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 - тип значения, возвращаемого методом run PrivilegedExceptionAction.
Параметры:
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 - тип значения, возвращаемого методом run PrivilegedExceptionAction.
Параметры:
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 - тип значения, возвращаемого методом run PrivilegedExceptionAction.
Параметры:
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 - тип значения, возвращаемого методом run PrivilegedExceptionAction.
Параметры:
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 - тип значения, возвращаемого методом run PrivilegedExceptionAction.
Параметры:
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

Spec-Zone .ru
спецификации, руководства, описания, API