Java SecurityManager @Override public void checkPermission(Permission perm)

Fla*_*vio 6 java swing securitymanager

我正在构建一个SWING应用程序,还需要编写一个自定义的SecurityManager.如果我写一个像这样扩展SecurityManager的空类

public class Sandbox extends SecurityManager {}
Run Code Online (Sandbox Code Playgroud)

它运行正常,这意味着GUI被正确呈现,并且所有特权(如I/O)都被撤销.但是我需要自定义checkPermission方法,每当我覆盖它时,任何东西都不再有效......为什么即使是这样的东西也不行?

public class Sandbox extends SecurityManager {
  @Overide
  public void checkPermission(Permission perm) {
    super.checkPermission(perm);
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:显示问题的一个非常基本的例子就是这个

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);

}
Run Code Online (Sandbox Code Playgroud)

删除"checkPermission"方法应用程序正常工作,但我真的无法理解这一点.

mik*_*ike 0

如果你调用超类,checkPermission(p)你就不必首先覆盖该类。注释掉,然后就可以了。

超类的调用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)
Run Code Online (Sandbox Code Playgroud)

ETC。

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我找到了有关如何编写安全管理器的教程。我还建议您阅读 java 文档和 oracle 提供的示例。


更新

查看方法摘要并覆盖您要禁止的功能。据我发现,您需要明确允许您想要的功能。

这里有一个例子:

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();

  }
}
Run Code Online (Sandbox Code Playgroud)

输出

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)
Run Code Online (Sandbox Code Playgroud)