将java类的访问限制为某些包

将java类的访问限制为某些包,java,Java,我有一个Java类,其中包含一些机密信息,我不想提供给任何未经授权的类。 我想在一些包中访问这个类(来自这个包的类将使用机密信息),以便在这些包中可以访问我的安全类 是否有任何方法可以检查方法的调用方是否是授权包中的授权类 我知道public/private/default所有的东西(所以请不要让我使用它),但是在这里这些东西都没有用,因为我希望一个类可以在一些包(不是一个/相同)中访问。您可以使用,由Java中的类实现-它完全是为您的目的而设计的 这是一个指南 EDIT:AFAIK,您不能对静

我有一个
Java
类,其中包含一些机密信息,我不想提供给任何未经授权的类。

我想在一些包中访问这个类(来自这个包的类将使用机密信息),以便在这些包中可以访问我的安全类

是否有任何方法可以检查方法的调用方是否是授权包中的授权类

我知道public/private/default所有的东西(所以请不要让我使用它),但是在这里这些东西都没有用,因为我希望一个类可以在一些包(不是一个/相同)中访问。

您可以使用,由Java中的类实现-它完全是为您的目的而设计的

这是一个指南


EDIT:AFAIK,您不能对静态方法使用常规代理机制,因为代理和代理类必须实现一个公共接口。但是,还有更高级的工具,可以帮助您喜欢。不幸的是,我自己并不熟悉它。

您可以创建一个
异常
(无需抛出它),并使用
getStackTrace()
分析调用堆栈。但我总是觉得它很难看


也就是说,您在客户端机器中放入的任何东西都容易受到该机器的攻击;如果你有真正机密的东西,在你的服务器上保护它;使其仅作为服务提供。

Java中的可见性修饰符不是一种安全工具,而是一种OO设计工具。无论您做什么,如果有人使用您的类,它都可以使用反射访问任何类的任何私有成员


如果您的对象包含机密信息,请将这些对象留在您的安全服务器中。

我觉得您走错了方向。这可能是一个设计问题

安全需求是您的业务逻辑。您应该以某种方式实现安全策略,而不是依赖java语言级别的可见性修饰符或调用程序包名称。因为如果你把你的罐子给某人,他无论如何都可以访问你的“机密”类

而且,类是一种类型,一种抽象的东西。它不应包含“数据”。当然,有时conf信息是作为静态变量等编写的。但是,如果某些数据是敏感的,则不应在类中编写。它可以存储在数据库或加密文件等。一旦收到对敏感信息的请求,如果允许访问这些数据,请检查已实施的安全策略


就我的2个客户而言,您可能可以在这里利用aspectj。理论上,可以根据当前流范围截取对给定类的方法的调用,并让方面抛出异常或其他东西。虽然我不是aspectj专家,但“cflow”切入点限定符是最有可能的赌注。也许是这样的

!!cflow(调用(*com.mycom.AllowedClient.*))

我还没有测试过这种切入点,但我相信它会起作用

不过,在这种情况下,您可能需要编译时编织(与加载时编织相反)


作为旁注,我同意其他一些人的看法,我认为这是错误的做法。您可以保护数据。您根据登录用户权限保护了功能访问。您通常不保护来自其他类的函数调用。

准则4-2/EXTEND-2:限制程序包的可访问性 容器可以通过添加到package.access安全属性来隐藏实现代码。此属性防止来自其他类加载器的不受信任类链接并使用指定包层次结构上的反射。在设置此属性之前,必须小心确保不受信任的上下文无法访问包

此示例代码演示如何附加到package.access安全属性。请注意,它不是线程安全的。此代码通常在系统中只出现一次

private static final String PACKAGE\u ACCESS\u KEY=“PACKAGE.ACCESS”;
静止的{
字符串packageAccess=Security.getProperty(包访问密钥);
Security.setProperty(包访问密钥,
(packageAccess==null | | packageAccess.trim().isEmpty()
?“”:packageAccess+”,“”)
+“xx.示例.产品.实现。”);
}

你能让它变得多么笨拙?你需要调用方付出多少努力?@RohitJain——实际上有几种方法可以处理这个问题,但它们需要一些努力才能实现。你是说实际的类定义包含你想要保护的数据,还是它是存储在其他地方的数据的对象载体?嗨,Glen,举个简单的例子-ammm。。。假设我的类有一个返回数据库连接的方法,并且我希望仅从某些选定的包中调用/使用该方法。(我还想实现其他视图)。可能有一种方法可以通过
doPrivileged
机制实现这一点。java中没有任何方法可以保护我们的.jar/.class文件吗?@Patriks是的!但目标是保护jar文件不被反编译。或者让人很难阅读/理解你的反编译类。例如但是这是否适合你的情况?Hi kostja,这对我很有用:)谢谢,但是如果我的类有静态的方法,我可以应用同样的方法吗?Matt你是对的,甚至我也同意,但这不是100%保护机密数据,至少%是项目设计的一部分,我只想让一些包访问我的一些类。并限制从某些包访问某些类。