我正在构建一个SWING应用程序,还需要编写一个自定义的SecurityManager。如果我写一个像这样扩展SecurityManager的空类
public class Sandbox extends SecurityManager {}
它工作正常,这意味着GUI被正确呈现,并且所有特权(如I / O)都被撤销。 但是我需要自定义checkPermission方法,每当我覆盖它时,任何东西都不再有效...... 为什么即使这样的事情也不起作用?
public class Sandbox extends SecurityManager {
@Overide
public void checkPermission(Permission perm) {
super.checkPermission(perm);
}
}
更新:显示问题的一个非常基本的例子就是这个
public static void main(String[] args) {
System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission p) {
if (some_condition_here) {
// Do something here
} else {
// Resort to default implementation
super.checkPermission(p);
}
}
});
new JFrame().setVisible(true);
}
删除应用程序正常运行的“checkPermission”方法,但我真的无法理解这一点。
答案 0 :(得分:1)
根据堆栈上的所有代码授予权限。所有呼叫者必须具有所需的权限。如果重写方法并调用超类方法,那么代码也在堆栈中,这意味着您的代码库(您的自定义SecurityManager所属的代码库)必须具有您(您的调用者)所要求的权限。
这是重写与否之间的区别。如果不覆盖该方法,则只有(可能是特权的)调用者的代码在堆栈上,并且它将获得所请求的权限。如果覆盖该方法,则代码也在堆栈中,并且必须具有权限。
因此,如果要实现调用继承检查方法的自定义SecurityManager,则必须配置继承(基于策略)逻辑,以便为SecurityManager提供应该能够授予的所有权限。建议将SecurityManager与应用程序的其余部分分离到不同的代码库中,这样只有SecurityManager才能获得慷慨的权限。
答案 1 :(得分:0)
如果您调用超类“checkPermission(p)
,则首先不必覆盖该类。评论它,然后它可以工作。
superclas'调用java.security.AccessController.checkPermission(perm)
,而java.security.AccessControlException
java.lang.SecurityManager
在我的情况下,它说:
Could not load Logmanager "null"
java.security.AccessControlException: access denied (java.util.PropertyPermission java.util.logging.manager read)
等
public class SecurityManagerExample
{
public static void main(String[] args)
{
System.setSecurityManager(new SecurityManager()
{
@Override
public void checkPermission(Permission p)
{
//super.checkPermission(p);
}
});
new JFrame().setVisible(true);
}
}
我找到了关于如何编写安全管理器的tutorial。我还建议你阅读java doc和oracle提供的例子。
<强>更新强>
查看method summary并覆盖您要禁止的功能。 我发现你还需要明确允许你想拥有的功能。
这是一个例子:
public class SecurityManagerExample
{
public static void main(String[] args)
{
System.setSecurityManager(new SecurityManager()
{
@Override
public void checkWrite(String file) {
// no exception is thrown, i. e. creating files is allowed in general
}
@Override
public void checkDelete(String file)
{
if (file.equals("test.xml"))
{
throw new SecurityException("Not allowed to delete test.xml!");
}
}
});
File f = new File("test.xml");
try
{
f.createNewFile();
}
catch (IOException e)
{
}
f.delete();
}
}
<强>输出强>
Exception in thread "main" java.lang.SecurityException: Not allowed to delete test.xml!
at main.SecurityManagerExample$1.checkDelete(SecurityManagerExample.java:60)
at java.io.File.delete(File.java:902)
at main.SecurityManagerExample.main(SecurityManagerExample.java:74)