Подтвердить что ты не робот

Когда следует использовать AccessController.doPrivileged()?

Если я правильно понимаю AccessController.doPrivileged, он говорит, что ненадежный код должен иметь возможность вызывать методы, требующие разрешений (например, System.getProperty()), посредством промежуточного метода у которого есть разрешения.

Возникает вопрос: когда следует использовать AccessController.doPrivileged()? Когда нужно, чтобы недоверенный код мог вызывать привилегированный код с помощью промежуточных методов? Когда это произойдет?

Следуя вашим рассуждениям, объясните, почему создание ClassLoader всегда должно быть разрешено: http://findbugs.sourceforge.net/bugDescriptions.html#DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED

4b9b3361

Ответ 1

Согласитесь с Suraj answer, но я подумал, что добавлю конкретный пример, где мне нужно использовать привилегированный блок.

Представьте, что вы создали приложение, которое предоставляет ряд услуг для подключаемых модулей. Таким образом, ваше приложение и его службы являются надежным кодом. Однако подключаемые модули не обязательно доверяются и загружаются в свои собственные загрузчики классов (и имеют свои собственные домены защиты).

Когда подключаемый модуль вызывает службу, вы выполняете выборочные проверки безопасности ( "имеет ли подключаемый модуль X разрешение на использование этой службы" ). Но сама услуга может потребовать некоторые основные разрешения Java (прочитать системное свойство, записать в файл и т.д.). Код, требующий этих разрешений, заверяется в doPrivileged(), так что недостаточные разрешения от ненадежных подключаемых модулей эффективно игнорируются - применяются только привилегии вашего модуля доверенных служб.

Ответ 2

  • .. через промежуточный метод, который имеет разрешения. Нет, окончательные эффективные разрешения - это пересечение всех разрешений в стеке домена. Итак, предположим, что операция требует разрешения B для выполнения, и говорят, что некоторые промежуточные LIB имеют два разрешения B и A. Теперь, когда некоторый ненадежный код с только разрешением A вызывает LIB, эффективный набор разрешений (A intersect (A+B)) = A. Следовательно, ненадежный код не может использовать промежуточную LIB для получения дополнительных разрешений.

  • Когда следует использовать препринтированные? → В Java существует много операций, требующих, чтобы домен вызывающего абонента имел определенные разрешения для успешного выполнения этих операций. System.getProperty - одна из этих операций. Все операции с файлами также требуют специальных разрешений. Когда вы используете AccessController.doPrivileged для вызова этих операций, операция выполняется со всеми правами (разрешениями) вашего домена защиты. Следовательно, если ваш код имеет достаточно прав только тогда, он сможет выполнить эти операции.

Ответ 3

По сути, AccessController.doPriviledged() является эквивалентом файла set-user-id. Он говорит: "Настоящим я прошу, чтобы этот метод выполнялся с моими привилегиями, даже если я был вызван методом, который их не имеет".

Ответ 4

Проверьте эти ссылки и прокрутите страницу вниз до использования API-интерфейса doPrivileged.

Java 6: http://docs.oracle.com/javase/6/docs/technotes/guides/security/doprivileged.html

Java 7: http://docs.oracle.com/javase/7/docs/technotes/guides/security/doprivileged.html

Когда метод CheckCermission AccessController вызывается последним вызывающим абонентом, базовый алгоритм для решения, разрешать или запрещать запрашиваемый доступ, выглядит следующим образом:

Если код для любого вызывающего абонента в цепочке вызовов не имеет запрашиваемого разрешения, выбрано AccessControlException, если только не указано следующее: вызывающий, код которого предоставлен указанному разрешению, был помечен как "привилегированный" (см. ниже) и все стороны, впоследствии вызванные этим абонентом (прямо или косвенно), имеют указанное разрешение