Java安全性:如何确保类只能从特定包访问?
现在我知道我可以将一个方法标记为“无修饰符”,这样它只能由类和包访问 但这不是我在这种情况下需要的。我需要的是: 类“Secure.java”上的方法只能从同一JAR文件中的其他类访问 和(这是额外的) 当对安全方法进行调用时,调用堆栈不会返回到不安全的类&然后再次返回。例如: 这很好:Java安全性:如何确保类只能从特定包访问?,java,Java,现在我知道我可以将一个方法标记为“无修饰符”,这样它只能由类和包访问 但这不是我在这种情况下需要的。我需要的是: 类“Secure.java”上的方法只能从同一JAR文件中的其他类访问 和(这是额外的) 当对安全方法进行调用时,调用堆栈不会返回到不安全的类&然后再次返回。例如: 这很好: com.nonsecure.ClassA.doStuff()调用 com.nonsecure.ClassB.doStuff()调用 com.secure.secure.doStuff()调用 com.secu
- 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外部直接访问 允许
您说您正在使用Spring:也许可以看看JavaWorld中的这些文章,看看OSGI能在多大程度上帮助您。最后我使用了上面的checkSecurity()方法
我没有找到Java 1.6的功能来帮助我。这是可以找到的,但是可能有多达700个类需要使用这个SecureMap类型的对象,我真的不想在一个包中包含700个文件(+所有支持类)@jeffporter您需要在您的问题中添加新的约束条件。感谢您提供的信息,我目前无法使用OSGI。但我可能会在以后的项目中使用它!