2017-08-30 5 views
3

のための単一のチェック、調整を除いNOセキュリティマネージャと同じであるJavaのSecurityManager:私はよくJavaのセキュリティ管理に精通し、したがって、私の理解を確認したいわけではないにSystem.exit

私はjavaプロセスを持っています誰かがそれを殺したという痕跡がないのに、ランダムに停止します(シャットダウンフックが実行されます)。その結果、私はセキュリティマネージャをインストールし、checkExit(int status)を上書きして、停止の理由がSystem.exit()を呼び出すものでないことを確認しました。私は私のプログラムが唯一の変更は、スタックトレースは、()でSystem.exit場合投棄されるだろうと呼ばれていたということで、いつものように実行することを期待していた

  System.setSecurityManager(new SecurityManager() { 
       @Override 
       public void checkExit(int status) { 
        Thread.dumpStack(); 
        super.checkExit(status); 
       } 
      }); 

:基本的に私はこれを書いています。私はこれが事実でないことを発見した。これは、このセキュリティ例外で起動に失敗:

java.security.AccessControlException: access denied ("java.util.PropertyPermission" "config" "read") 
     at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) ~[na:1.8.0_74] 
     at java.security.AccessController.checkPermission(AccessController.java:884) ~[na:1.8.0_74] 
     at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) ~[na:1.8.0_74] 
     at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294) ~[na:1.8.0_74] 
     at java.lang.System.getProperty(System.java:717) ~[na:1.8.0_74] 
     at Main.main(Main.java:161) ~[na:na] 

SecurityManagerがデフォルトの動作を複製せず、それについて読んだ後、それは非常に限定的である${JAVA_HOME}/jre/lib/security/java.policyの下で、デフォルトのポリシーを適用していることと思われることが表示されます。

セキュリティマネージャがない場合のJavaの実際のデフォルト動作は何ですか?それは「すべてを許す」か、何か他に何か起こっているのでしょうか?

上記の1つの調整を除いて、デフォルトの動作を複製する場合は、セキュリティマネージャとして何をインストールする必要がありますか?

最後の点では、私はSystem.setSecurityManager()が実際にはjava.lang.SecurityManagerのインスタンスを期待していることがわかります。つまり、その実装(ポリシーファイルに依存しています)を強制的に使用しています。 NOセキュリティマネージャの実際のデフォルト動作を複製するために、そのクラスのメソッドをオーバーライドする最も効率的な方法は何でしょうか?

EDIT:以下の議論を1として、これはそれをあなたが混乱している

  System.setSecurityManager(new SecurityManager() { 
       @Override 
       public void checkPermission(Permission perm) { 
        return; // no security manager behaviour 
       } 

       @Override 
       public void checkPermission(Permission perm, Object context) { 
        return; // no security manager behaviour 
       } 

       @Override 
       public void checkExit(int status) { 
        Thread.dumpStack(); 
        super.checkExit(status); 
       } 
      }); 

答えて

2

を行うようです。

SecurityManagerがデフォルトの動作を複製せず、それについて読んだ後、それは非常に限定的である$ {JAVA_HOME} /jre/lib/security/java.policyの下で、デフォルトのポリシーを適用していることと思われることが表示されます。

SecurityManagerのデフォルトの動作は確かに非常に制限的であるデフォルト.policyファイル、で許可され以外のJavadocに記載された契約、に従うことです。 のデフォルトの動作であるセキュリティマネージャのは何かを許可することです。

セキュリティマネージャがない場合のJavaの実際のデフォルト動作は何ですか?それは「すべてを許可する」か?

はい。

何か他に何か起こっていますか?

上記の1つの調整を除いて、デフォルトの動作を複製したい場合は、セキュリティマネージャとして何をインストールする必要がありますか?

正確にそれを行うセキュリティマネージャ。実装したオーバーライドを除いて何も実行しない場合は、他のすべてのメソッドに対して空のオーバーライドを指定する必要があります。

+0

javadocから:特別なメソッド 'SecurityManager.checkPermission(java.security.Permission)'は、指定されたアクセス権によって示されるアクセス要求を許可するか拒否するかを決定します。デフォルトの実装では、 'AccessController.checkPermission(perm); を呼び出します。' checkPermission() 'をオーバーライドしてただちに戻りますか?編集:checkPermission()メソッドの2つのバリエーションがあり、これらの2をオーバーライドするだけでOKのはずのソースを見てください。 – Alexandros

+0

いいえ、あなたが 'Permission'の場合は* except *を返すようにオーバーライドする必要がありますチェックするには、 'super.checkPermission()'を呼び出してスタックトレースをダンプします。確かにこれは明らかですか? – EJP

+0

しかし、私は何もチェックしたくないです(セキュリティマネージャが存在しない場合のjavaのデフォルト動作)。したがって、すべてがcheckPermissionに委任しているので、 "DoNothingSecurityManager"を持つ最小限の変更は2つのメソッドをオーバーライドすることでしょうか?ですから、checkExit()でスタックトレースをダンプする3番目のオーバーライドでは、これをチェックするのが良いでしょう。 – Alexandros

関連する問題