现在我知道我可以将一个方法标记为'无修饰符',这样它只能通过Class& amp;封装
虽然这不是我在这种情况下所需要的。我需要的是:
类“Secure.java”上的方法只能从同一JAR文件中的其他类访问。
AND(这是额外的)
当调用安全方法时,调用堆栈不会返回到非安全类&然后又回来了。例如:
这很好:
这很糟糕:
现在我想我可以通过一些手工工作来做到这一点:
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>()
但似乎只是关于访问资源/网络连接等。 不是为了访问调用堆栈以确保某种程序包保护。
注意:
答案 0 :(得分:1)
你的标题是“来自同一个包裹”,提供了提示。将类放入与可以访问它的类相同的包中;不要公开,所以它只能在该包中的类访问;签署JAR文件;并密封包装。
答案 1 :(得分:1)
您基本上是在寻找基于类的容器(jar)的访问限制。 Java本身并不提供这样的控制(至少不容易)。
OSGI规范更接近您想要实现的访问控制。从本质上讲,OSGI支持并实施基于jar文件(它称为 bundle )的访问限制和规则。
你说你正在使用Spring:或许可以查看来自JavaWorld here和here的这些文章来检查OSGI可以帮助你的程度。
答案 2 :(得分:0)
最后我使用了上面的checkSecurity()方法。
我没有找到帮助我的Java 1.6功能。