18

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

出力:

始める
[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
ため、指定されたポリシー ファイルが使用される唯一のポリシー ファイルになります。

ファイルは次のようになります。

許す {
    アクセス権 java.security.AllPermission;
    許可 java.lang.reflect.ReflectPermission "suppressAccessChecks";
};

私はこれに最後の 3 時間を費やしましたが、これを機能させる方法についてのアイデアはありません。どんな助けでも感謝します。

4

3 に答える 3

7

これをプログラムの main() に追加してみてください:

System.setSecurityManager(null);

セキュリティマネージャーの問題が発生したときに、「信頼できる」WebStart アプリケーションで機能しました。あなたの db4o ケースでうまくいくかどうかはわかりませんが、試してみる価値はあります。

編集:これがセキュリティマネージャーの問題に対する一般的な解決策であることを示唆しているわけではありません。元のポスターの問題をデバッグするのに役立つ方法として提案しただけです。明らかに、セキュリティ マネージャを利用したい場合は、それを無効にしないでください。

于 2009-04-18T00:18:29.940 に答える
5

java.security.policyコマンドラインオプションに本当に2つの「=」記号がありますか?それはうまくいきません。プロパティを次のように設定していることを確認してください

-Djava.security.policy=/home/pablo/.java.policy

を実際に無効にするにはSecurityManagerjava.security.managerシステムプロパティを完全に除外するだけで十分です。


更新:「==」構文について詳しく知るためにポリシーファイルのドキュメントを読んでいたときに、ポリシーファイルが現在の作業ディレクトリにない限り、URL(スキームを含む)として指定する必要があることに気付きました。ポリシーパスの前に「file:」スキームを付けてみましたか?

また、(ユーザー「pablo」として実行していると仮定して)ポリシーはデフォルトでホームディレクトリからロードされるように見えるので、まったく指定する必要がないので、私も戸惑いました。一方、ユーザー「pablo」として実行していない場合は、ファイルが読み取れない可能性があります。

于 2009-04-17T22:54:57.440 に答える
4

コードからプライベート フィールドとメソッドにアクセスできるようにする方法の例を見つけました。基本的に、それは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);

また、Groovy は Java コードのアクセス レベル制限の多くを (現在) 回避しているため、Java コードで Groovy を使用することも検討できます。ただし、この掲示板への投稿は、この「機能」が Groovy の将来のバージョンで変更される可能性があることを示唆しているようです。

于 2009-04-18T05:55:01.597 に答える