繁体   English   中英

我可以使用 java.security 强制可见性吗?

[英]Can I enforce visibility using java.security?

这是关于这个问题的后续问题,它是关于 Groovy(Java 的超集/现代化),其中似乎基本上没有信息隐藏和任何封装。

但是在 Java 中当然也有反射,这意味着privateprotected和 package-private 本质上是毫无意义的,或者更糟糕的是:制造一种虚假的安全感。

在 Java 中,是否有任何方法可以强制某种形式的可见性,不一定是使用SecurityManager专门强制执行上述可见性修饰符和包私有? 我才刚刚开始研究后者,我看不到任何非常明显的方法来完成这样的事情。 但似乎有些开发人员必须在某些类和方法没有完全公开可见性的地方发布代码……那么它是如何完成的呢?

Lucene 包中的 PS,我对它有点熟悉,我注意到很多类都是final (这有时让我有些头疼......)但我很确定,虽然不确定,该反射可用于挤压该修饰符

无论 SecurityManager 配置如何,我都可以将我的类编写为 setAccessible-proof 吗? ... 或者我是否受到管理配置的人的支配?

你不能,而且你肯定是。 任何有权访问您的代码的人都可以随意配置他们的 JVM 和 SecurityManager。 (更多详情见下文)

setAccessible 合法吗? 它为什么存在?

Java 核心类使用它作为访问出于安全原因必须保持私有的内容的简单方法。 例如,Java 序列化框架在反序列化对象时使用它来调用私有对象构造函数。 有人提到了 System.setErr,这将是一个很好的例子,但奇怪的是 System 类方法 setOut/setErr/setIn 都使用本机代码来设置最终字段的值。

另一个明显的合法用途是需要查看对象内部的框架(持久性、Web 框架、注入)。

最后...

Java 访问修饰符并非旨在成为一种安全机制。

那么我能做什么呢?

您应该更深入地查看 Java SE 安全文档的安全提供程序部分:

应用程序不需要自己实现安全性。 相反,他们可以从 Java 平台请求安全服务。 安全服务在提供者中实现

Java 平台中的访问控制架构保护对敏感资源(例如,本地文件)或敏感应用程序代码(例如,类中的方法)的访问。 所有访问控制决策都由安全管理器进行调解,由java.lang.SecurityManager类表示。 必须将 SecurityManager 安装到 Java 运行时中才能激活访问控制检查。

Java 小程序和 Java™ Web Start 应用程序在安装了 SecurityManager 的情况下自动运行。 但是,默认情况下,通过java命令执行的本地应用程序不会在安装了 SecurityManager 的情况下运行。 为了使用 SecurityManager 运行本地应用程序,应用程序本身必须通过setSecurityManager方法(在java.lang.System类中)以编程方式设置一个,或者必须在命令中使用-Djava.security.manager参数调用 java线。

我建议您在官方安全文档中进一步阅读有关此内容的信息

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

我仍然对这个问题感到困惑。

但是,现在有一个简单的想法浮现在脑海:实际上我们是否只是打算将Groovy闭包用于私有国家?

我尝试对此进行一些搜索,但没有任何反应。 也没有专家为此回答这个问题。

再进一步说,实际上,将闭包用于私有状态的要求(因为它是唯一可用的闭包)是否可能是一种“微动”机制,旨在使Groovy编码人员倾向于使用函数式编程技术? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM