Javaセキュリティマネージャを完全に無効にする方法はありますか?
私はdb4oのソースコードを試しています。リフレクションを使用してオブジェクトを永続化し、セキュリティマネージャはリフレクションがプライベートフィールドまたは保護されたフィールドの読み取りと書き込みを許可していないようです。
私のコード:
public static void main(String[] args) throws IOException {
System.out.println("start");
new File( DB_FILE_NAME ).delete();
ObjectContainer container = Db4o.openFile( DB_FILE_NAME );
String ob = new String( "test" );
container.store( ob );
ObjectSet result = container.queryByExample( String.class );
System.out.println( "retrieved (" + result.size() + "):" );
while( result.hasNext() ) {
System.out.println( result.next() );
}
container.close();
System.out.println("finish");
}
出力:
start [db4o 7.4.68.12069 2009-04-18 00:21:30] AccessibleObject#setAccessible()は使用できません。プライベートフィールドは保存できません。 取得(0): 終了
このスレッド リフレクションを許可するようにJava.policyファイルを変更することを提案していますが、私にはうまくいかないようです。
引数でJVMを開始しています-Djava.security.manager -Djava.security.policy==/home/pablo/.Java.policy
指定されたポリシーファイルが使用される唯一のポリシーファイルになります
ファイルは次のようになります。
grant { permission Java.security.AllPermission; permission Java.lang.reflect.ReflectPermission "suppressAccessChecks"; };
私はこれに最後の3時間を費やしましたが、これを機能させる方法がわかりません。助けていただければ幸いです。
これをプログラムのmain()に追加してみてください。
System.setSecurityManager(null);
セキュリティマネージャの問題が発生したときに、「信頼できる」WebStartアプリケーションで働いていました。 db4oの場合に機能するかどうかはわかりませんが、試してみる価値があるかもしれません。
編集:これがセキュリティマネージャの問題に対する一般的な解決策であることを示唆しているわけではありません。元の投稿者の問題をデバッグするのに役立つ方法として提案していました。明らかに、セキュリティマネージャの恩恵を受けたい場合は、それを無効にしないでください。
Java.security.policy
コマンドラインオプションに本当に2つの「=」記号がありますか?それはうまくいきません。プロパティを次のように設定していることを確認してください
-Djava.security.policy=/home/pablo/.Java.policy
実際にSecurityManager
を無効にするには、Java.security.manager
システムプロパティを完全に除外するだけで十分です。
更新: "=="構文について詳しく知るためにポリシーファイルのドキュメントを読んでいたときに、ポリシーファイルが現在の作業ディレクトリにない限り、次のように指定する必要があることに気付きました。 URL(スキームを含む)。ポリシーパスの前に「file:」スキームを付けてみましたか?
また、(ユーザー「pablo」として実行していると仮定して)ポリシーはデフォルトでホームディレクトリから読み込まれるように見えるため、まったく指定する必要がないため、戸惑いました。一方、ユーザー「pablo」として実行していない場合は、ファイルが読み取れない可能性があります。
コードに プライベートフィールドとメソッドをアクセス可能にする 方法のこの例を見つけました。基本的には、Field.setAccessible(true)およびMethod.setAccessible(true)の使用に要約されます。
フィールドの例:
Field privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);
メソッドの例:
Method privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);
privateStringMethod.setAccessible(true);
JavaコードでGroovyを使用することも検討できます。これは、(現在)Javaコードのアクセスレベル制限の多くを回避するためです。ただし、このメッセージボード投稿はこの「機能」を示唆しているようです Groovyの将来のバージョンで変更される可能性があります 。