2

现在我知道我可以将一个方法标记为“无修饰符”,以便它只能由类和包访问。

在这种情况下,这不是我需要的。我需要的是这个:

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

和(这是额外的)

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

这很好:

  • 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() 调用 [糟糕:我们超出了安全 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 外部直接访问。
4

3 回答 3

1

您的标题说“来自同一个包”,它提供了提示。将该类放入与可以访问它的类相同的包中;不要将其公开,因此仅该包中的类可以访问它;签署 JAR 文件;并密封包装。

于 2012-11-23T09:45:10.917 回答
1

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

OSGI 规范更接近您想要实现的访问控制。本质上,OSGI 确实支持和强制执行基于 jar 文件(它称为bundles)的访问限制和规则。

您说您正在使用 Spring:也许可以在此处此处查看 JavaWorld 的这些文章,以检查 OSGI 可以在多大程度上帮助您。

于 2012-11-23T11:48:00.320 回答
0

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

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

于 2013-05-28T10:32:54.360 回答