Можно ли написать, чтобы мои классы были защищены от 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
SecurityManager
для обеспечения видимости. Как это сделать, если это действительно возможно? - person mike rodent   schedule 15.06.2018