Java SecurityManager @Override public void checkPermission(Permission perm)

时间:2013-09-03 17:16:25

标签: java swing securitymanager

我正在构建一个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”方法,但我真的无法理解这一点。

2 个答案:

答案 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)