6

私は 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」メソッドを削除すると、アプリケーションは正しく機能しますが、これについては本当に理解できません。

4

2 に答える 2

1

アクセス許可は、スタック上のすべてのコードに基づいて付与されます。すべての呼び出し元は、必要なアクセス許可を持っている必要があります。メソッドをオーバーライドしてスーパークラス メソッドを呼び出すと、コードもスタック上に置かれます。これは、コードベース (カスタム SecurityManager が属する場所) に、ユーザー (呼び出し元) が要求するアクセス許可が必要であることを意味します。

それがオーバーライドするかしないかの違いです。そのメソッドをオーバーライドしない場合、(おそらく特権付きの) 呼び出し元のコードのみがスタックにあり、要求されたアクセス許可を取得します。そのメソッドをオーバーライドすると、コードもスタック上にあり、パーミッションも必要になります。

そのため、継承されたチェック メソッドを呼び出すカスタム SecurityManager を実装する場合は、継承された (ポリシー ベースの) ロジックを構成して、SecurityManager が付与できるすべてのアクセス許可を付与する必要があります。SecurityManager をアプリケーションの残りの部分から別のコードベースに分離して、SecurityManager のみが寛大なアクセス許可を取得するようにすることをお勧めします。

于 2013-09-04T12:47:09.690 に答える
0

スーパークラスを呼び出す場合checkPermission(p)、そもそもクラスをオーバーライドする必要はありませんでした。コメントアウトすると、機能します。

スーパークラスの呼び出しと、によって呼び出されない場合、java.security.AccessController.checkPermission(perm)をスローするようですjava.security.AccessControlExceptionjava.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);
  }
}

セキュリティマネージャーの書き方に関するチュートリアルを見つけました。また、Java ドキュメントとオラクルが提供する例を確認することをお勧めします。


アップデート

メソッドの概要を見て、禁止したい機能をオーバーライドしてください。私が知ったように、必要な機能を明示的に許可する必要もあります。

ここに例があります:

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)
于 2013-09-04T11:42:29.980 に答える