Spec-Zone.ru › OpenJDK 8

Класс 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, который принимает решения о доступе на основе контекста, который он encapsulates, а не контекста текущего потока выполнения. Таким образом, код в другом контексте может вызвать этот метод на ранее сохранённом объекте 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.

См. также:
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 не был создан системным кодом, а вызывающему объекту ProtectionDomain не предоставлено разрешение «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 не был создан системным кодом, а вызывающему объекту ProtectionDomain не предоставлено разрешение «createAccessControlContext» SecurityPermission, то действие выполняется без разрешений.

Параметры типа:
T - тип значения, возвращаемого методом run PrivilegedAction.
Параметры:
action - действие, подлежащее выполнению.
context - контекст управления доступом, представляющий ограничение, которое должно быть применено к привилегиям области защиты вызывающего объекта перед выполнением указанного действия. Если контекст null, то дополнительное ограничение не применяется.
perms - аргументы Permission, которые ограничивают область действия привилегий вызывающего объекта. Количество аргументов изменяемо.
Возвращает:
значение, возвращаемое методом run действия.
Исключения:
NullPointerException - если действие или perms или любой элемент perms 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 не был создан системным кодом, а вызывающему объекту ProtectionDomain не предоставлено разрешение «createAccessControlContext» SecurityPermission, то действие выполняется без разрешений.

Параметры типа:
T - тип значения, возвращаемого методом run PrivilegedAction.
Параметры:
action - действие, подлежащее выполнению.
context - контекст управления доступом, представляющий ограничение, которое должно быть применено к привилегиям области защиты вызывающего объекта перед выполнением указанного действия. Если контекст null, то дополнительное ограничение не применяется.
perms - аргументы Permission, которые ограничивают область действия привилегий вызывающего объекта. Количество аргументов изменяемо.
Возвращает:
значение, возвращаемое методом run действия.
Исключения:
NullPointerException - если действие или perms или любой элемент perms 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 — если действие или разрешения или любой элемент разрешений является 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 — если действие или разрешения или любой элемент разрешений является 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API