Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java安全性:如何确保类只能从特定包访问?_Java - Fatal编程技术网

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

Java安全性:如何确保类只能从特定包访问?,java,Java,现在我知道我可以将一个方法标记为“无修饰符”,这样它只能由类和包访问 但这不是我在这种情况下需要的。我需要的是: 类“Secure.java”上的方法只能从同一JAR文件中的其他类访问 和(这是额外的) 当对安全方法进行调用时,调用堆栈不会返回到不安全的类&然后再次返回。例如: 这很好: com.nonsecure.ClassA.doStuff()调用 com.nonsecure.ClassB.doStuff()调用 com.secure.secure.doStuff()调用 com.secu

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

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

类“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>()
AccessController.doPrivileged(新的PrivilegedExceptionAction()
但似乎只是关于访问资源/网络连接等。 而不是访问调用堆栈以确保某种包保护

注:

  • 我正在使用Spring3
  • 包含安全代码的JAR文件已签名 有证书
  • 只能从以下位置访问安全类: 在JAR内部,不能从JAR外部直接访问 允许

您的标题上写着“来自同一个包”,这提供了提示。将该类与可能访问它的类放在同一个包中;不要将其公开,因此它只能由该包中的类访问;对JAR文件进行签名;并密封该包。

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

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


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

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


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

这是可以找到的,但是可能有多达700个类需要使用这个SecureMap类型的对象,我真的不想在一个包中包含700个文件(+所有支持类)@jeffporter您需要在您的问题中添加新的约束条件。感谢您提供的信息,我目前无法使用OSGI。但我可能会在以后的项目中使用它!