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

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

Но в Java тоже, конечно, есть рефлексия, а это означает, что private, protected и package-private по сути бессмысленны или, что еще хуже, создают ложное чувство безопасности.

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

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


person mike rodent    schedule 15.06.2018    source источник
comment
Можете ли вы сузить область, в которой вы хотите обеспечить видимость? На уровне компании? Для любого программного обеспечения там? Только для собственного проекта? Потому что для большинства из этих вещей на самом деле просто вопрос... если вы хотите сделать все общедоступным (неважно, правильно ли это), то просто убедитесь, что все обнародовано.   -  person Ben    schedule 15.06.2018
comment
Проблема с этим вопросом в том, что он ставит под сомнение внутреннюю желательность инкапсуляции и сокрытия информации. Я отсылаю вас к Effective Java Блоха.   -  person mike rodent    schedule 15.06.2018
comment
Я проголосовал, потому что согласен, что это не глупый вопрос. Однако я не вижу смысла в том, чего вы пытаетесь достичь. Вы боитесь, что кто-то взломает ваш байт-код? Что именно вам нужно, чего SecurityManager не может предоставить?   -  person Guilherme Mussi    schedule 15.06.2018
comment
@GuilhermeMussi Возможно, я не совсем ясно выразился, хотя мне так кажется: я не понимаю, как использовать SecurityManager для обеспечения видимости. Как это сделать, если это действительно возможно?   -  person mike rodent    schedule 15.06.2018
comment
Благодарю за разъяснение. Я добавил ответ.   -  person Guilherme Mussi    schedule 15.06.2018


Ответы (1)


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

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

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

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

Другим очевидным законным использованием являются фреймворки (persistence, web frameworks, инъекции), которым необходимо заглянуть внутрь объектов.

И наконец...

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

Итак, что я могу сделать?

Вам следует более подробно изучить раздел Security Providers документации по безопасности 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

person Guilherme Mussi    schedule 15.06.2018
comment
Э, хорошо, спасибо. Но я уже начал изучать SecurityManager. Опять же, мой вопрос делает это очевидным. Я спрашиваю об очень конкретной вещи: КАК я могу использовать SecurityManager для обеспечения, КОНКРЕТНО, видимости? Вам действительно нужно перечитать мой вопрос немного внимательнее. - person mike rodent; 15.06.2018
comment
Как я уже писал, нельзя. Невозможно предотвратить это. Может быть, вы можете рассказать немного больше о вашем случае использования. зачем вам это? Потому что любой, кто получит ваш код, может реализовать свой собственный SecurityManager. - person Guilherme Mussi; 15.06.2018
comment
Ради аргумента предположим, что я отвечаю за свой SecurityManager. Мой случай специфичен только в том смысле, что я пользователь Groovy (Groovy = надмножество/модернизация Java). Желательность сокрытия информации и инкапсуляции не нуждается в оправдании. Проблема в том, что модификаторы видимости в Groovy по существу игнорируются. - person mike rodent; 15.06.2018