のための単一のチェック、調整を除い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);
}
});
javadocから:特別なメソッド 'SecurityManager.checkPermission(java.security.Permission)'は、指定されたアクセス権によって示されるアクセス要求を許可するか拒否するかを決定します。デフォルトの実装では、 'AccessController.checkPermission(perm); を呼び出します。' checkPermission() 'をオーバーライドしてただちに戻りますか?編集:checkPermission()メソッドの2つのバリエーションがあり、これらの2をオーバーライドするだけでOKのはずのソースを見てください。 – Alexandros
いいえ、あなたが 'Permission'の場合は* except *を返すようにオーバーライドする必要がありますチェックするには、 'super.checkPermission()'を呼び出してスタックトレースをダンプします。確かにこれは明らかですか? – EJP
しかし、私は何もチェックしたくないです(セキュリティマネージャが存在しない場合のjavaのデフォルト動作)。したがって、すべてがcheckPermissionに委任しているので、 "DoNothingSecurityManager"を持つ最小限の変更は2つのメソッドをオーバーライドすることでしょうか?ですから、checkExit()でスタックトレースをダンプする3番目のオーバーライドでは、これをチェックするのが良いでしょう。 – Alexandros