Java安全性:如何确保类只能从特定包访问?

时间:2012-11-23 09:42:36

标签: java

现在我知道我可以将一个方法标记为'无修饰符',这样它只能通过Class& amp;封装

虽然这不是我在这种情况下所需要的。我需要的是:

类“Secure.java”上的方法只能从同一JAR文件中的其他类访问。​​

AND(这是额外的)

当调用安全方法时,调用堆栈不会返回到非安全类&然后又回来了。例如:

这很好:

  • com.nonsecure.ClassA.doStuff()调用
  • com.nonsecure.ClassB.doStuff()调用
  • com.secure.Secure.doStuff()调用
  • com.secure.SecureB.doStuff()

这很糟糕:

  • com.nonsecure.ClassA.doStuff()调用
  • com.nonsecure.ClassB.doStuff()调用
  • com.secure.Secure.doStuff()调用
  • com。 nonsecure .ClassC.doStuff()调用[BAD:我们走出了安全JAR中的类!]
  • com.secure.SecureB.doStuff()

现在我想我可以通过一些手工工作来做到这一点:

 private void checkSecurity()
  {
    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
    for (StackTraceElement stackTraceElement : stackTraceElements)
    {
      // TODO: Add a little magic to check that we've not stepped outside the secure packages.
      if (!stackTraceElement.getClassName().startsWith("com.secure"))
      {
         throw new SecurityException("Woop!");
      }
    }
  }

问题:感觉Java应该提供哪些东西来帮助我?

我读过

AccessController.doPrivileged(new PrivilegedExceptionAction<String>()

但似乎只是关于访问资源/网络连接等。 不是为了访问调用堆栈以确保某种程序包保护。

注意:

  • 我正在使用Spring 3
  • 包含安全代码的JAR文件已签名 有证书。
  • 只能访问安全类 在JAR内部,从JAR外部直接访问不得 允许的。

3 个答案:

答案 0 :(得分:1)

你的标题是“来自同一个包裹”,提供了提示。将类放入与可以访问它的类相同的包中;不要公开,所以它只能在该包中的类访问;签署JAR文件;并密封包装。

答案 1 :(得分:1)

您基本上是在寻找基于类的容器(jar)的访问限制。 Java本身并不提供这样的控制(至少不容易)。

OSGI规范更接近您想要实现的访问控制。从本质上讲,OSGI支持并实施基于jar文件(它称为 bundle )的访问限制和规则。

你说你正在使用Spring:或许可以查看来自JavaWorld herehere的这些文章来检查OSGI可以帮助你的程度。

答案 2 :(得分:0)

最后我使用了上面的checkSecurity()方法。

我没有找到帮助我的Java 1.6功能。