现在我知道我可以将一个方法标记为“无修饰符”,以便它只能由类和包访问。
在这种情况下,这不是我需要的。我需要的是这个:
类“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 外部直接访问。