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

时间:2012-10-09 11:50:28

标签: java

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

我想在某些软件包中访问此类(此软件包中的类将使用机密信息),因此我的安全类应该可以在这些软件包中访问。

有什么方法可以检查方法的来电者是否是授权包的授权类?

我知道公共/私人/默认所有东西(所以请不要让我使用它),但这些在这里没用,因为我希望在一些包中可以访问一个类(不是一个/同一个)。

6 个答案:

答案 0 :(得分:5)

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

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

而且,类是一种类型,一种抽象的东西。它不应包含“数据”。确定有时conf信息被写成静态变量等。但是如果某些数据是敏感的,则不应该在课堂上写。它可以存储在数据库或加密文件中等等。一旦请求敏感信息,您就可以检查已实施的安全策略,如果允许它访问这些数据的话。

只是我的2cents

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您可以创建Exception(不需要抛出它)并使用getStackTrace()来分析调用堆栈。不过,我总觉得它很难看。

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

答案 3 :(得分:0)

您可以使用由proxy pattern类在Java中实现的Proxy - 它完全是出于您的目的而设计的。

Here是一个操作方法。

编辑:AFAIK,您不能将常规代理机制用于静态方法,因为代理和代理类必须实现通用接口。但是,还有更多高级工具,可以帮助您了解javassist。不幸的是我自己并不熟悉。

答案 4 :(得分:0)

您可以在此处利用aspectj。从理论上讲,可以根据当前的流量范围拦截对给定类方法的调用,并使方面抛出异常或其他东西。虽然我不是专家,但是“cflow”切入点限定符将是你最有可能的赌注。也许是这样的

! cflow(call(* com.mycom.AllowedClient。*))

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

在这种情况下,你可能想要编译时编织(而不是加载时间编织)。

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

答案 5 :(得分:0)

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

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

private static final String PACKAGE_ACCESS_KEY = "package.access";

static {
    String packageAccess = Security.getProperty(PACKAGE_ACCESS_KEY);
    Security.setProperty(PACKAGE_ACCESS_KEY,
                         (packageAccess == null || packageAccess.trim().isEmpty()
                                 ? "" : packageAccess + ",")
                                 + "xx.example.product.implementation.");
}