Могу ли я обеспечить видимость, используя java.security?

Это вытекает из этого вопроса... который касается Groovy (= надмножество / модернизация Java), где, по-видимому, по существу нет скрытия информации и никакой инкапсуляции.

Но в Java, конечно же, есть отражение, а это означает, что private, protected и частный пакет по сути бессмыслен или хуже: создает ложное чувство безопасности.

В Java есть какой-либо способ обеспечения видимости, какой-то, не обязательно в смысле особого применения вышеуказанных модификаторов видимости, и частный пакет, используя SecurityManager? Я только начал изучать последнее, и я не вижу никакого очевидного способа сделать что-то подобное. Но может показаться, что некоторые разработчики должны отправлять код там, где некоторые классы и методы не имеют полностью публичной видимости... так как это делается?

PS в пакете Lucene, с которым я немного знаком, замечаю, что довольно много классов оказывается final (что иногда вызывало у меня головокружение...), но я почти уверен, хотя и не уверен, что это отражение можно использовать для подавления этого модификатора.

Downvotes
Ах, нет: вы должны быть любезны, чтобы сказать, почему в таком случае. Это не глупый вопрос, и теперь ваш отрицательный голос подсказывает, что вы не понимаете проблему.

1 ответ

Могу ли я написать свои классы, чтобы установить setAccessible-proof независимо от конфигурации SecurityManager? ... Или я во власти того, кто управляет конфигурацией?

Вы не можете, и вы, безусловно, есть. Любой, кто имеет доступ к вашему коду, может настроить JVM и SecurityManager по своему усмотрению. (более подробная информация ниже)

Является ли setAcessible законным? Почему это существует?

Базовые классы Java используют его как простой способ доступа к вещам, которые должны оставаться закрытыми по соображениям безопасности. Например, инфраструктура Java Serialization использует ее для вызова конструкторов частных объектов при десериализации объектов. Кто-то упомянул System.setErr, и это был бы хороший пример, но любопытно, что все методы класса System setOut / setErr / setIn используют собственный код для установки значения конечного поля.

Другое очевидное законное использование - это фреймворки (персистентность, веб-фреймворки, внедрение), которые должны заглянуть внутрь объектов.

И наконец...

Модификаторы доступа Java не предназначены для обеспечения безопасности.

Так что я могу сделать на самом деле?

Вы должны глубже изучить раздел " Поставщики безопасности" документации по безопасности Java SE:

Приложения не должны реализовывать безопасность самостоятельно. Скорее, они могут запрашивать услуги безопасности у платформы Java. Услуги безопасности реализованы в провайдерах

Архитектура управления доступом на платформе Java защищает доступ к конфиденциальным ресурсам (например, локальным файлам) или к чувствительному коду приложения (например, к методам в классе). Все решения по контролю доступа принимаются менеджером безопасности, представленным java.lang.SecurityManager учебный класс. SecurityManager должен быть установлен во время выполнения Java, чтобы активировать проверки контроля доступа.

Апплеты Java и приложения Java ™ Web Start автоматически запускаются с установленным SecurityManager. Тем не менее, локальные приложения выполняются через java команда по умолчанию не запускается с установленным SecurityManager. Для запуска локальных приложений с помощью SecurityManager либо само приложение должно программно установить его через setSecurityManager метод (в java.lang.System класс), или Java должен быть вызван с -Djava.security.manager аргумент в командной строке.

Я рекомендую вам прочитать об этом в официальной документации по безопасности.

https://docs.oracle.com/javase/7/docs/technotes/guides/security/overview/jsoverview.html

Другие вопросы по тегам