12

ポリシーファイルを使用せずにRMIアプリケーションにプログラムで許可AllPermissionsする方法は?

アップデート:

いくつかの調査の後、このカスタム ポリシー クラスを作成し、.xml を介してインストールしましたPolicy.setPolicy(new MyPolicy())

次のエラーが表示されます。

無効な権限: (java.io.FilePermission \C:\eclipse\plugins\org.eclipse.osgi_3.7.0.v20110613.jar 読み取り

class MyPolicy extends Policy {

    @Override
    public PermissionCollection getPermissions(CodeSource codesource) {
        return (new AllPermission()).newPermissionCollection();
    }

}
4

4 に答える 4

13

@EJPのアドバイスに基づいて、使用してデバッグし-Djava.security.debug=access、ポリシー ファイルに必要なすべてのアクセス許可を見つけました。

grant { permission java.net.SocketPermission "*:1024-", "connect, resolve"; };

grant { パーミッション java.util.PropertyPermission "*", "read, write"; };

grant { パーミッション java.io.FilePermission "<>", "read"; };

しかし、ポリシー ファイルを作成したくなかったのでjava.security.Policy、アプリケーションの起動時にクラスを拡張してポリシーを設定することにより、プログラムでこれを複製する方法を見つけました。Policy.setPolicy(new MinimalPolicy());

public class MinimalPolicy extends Policy {

    private static PermissionCollection perms;

    public MinimalPolicy() {
        super();
        if (perms == null) {
            perms = new MyPermissionCollection();
            addPermissions();
        }
    }

    @Override
    public PermissionCollection getPermissions(CodeSource codesource) {
        return perms;
    }

    private void addPermissions() {
        SocketPermission socketPermission = new SocketPermission("*:1024-", "connect, resolve");
        PropertyPermission propertyPermission = new PropertyPermission("*", "read, write");
        FilePermission filePermission = new FilePermission("<<ALL FILES>>", "read");

        perms.add(socketPermission);
        perms.add(propertyPermission);
        perms.add(filePermission);
    }

}

class MyPermissionCollection extends PermissionCollection {

    private static final long serialVersionUID = 614300921365729272L;

    ArrayList<Permission> perms = new ArrayList<Permission>();

    public void add(Permission p) {
        perms.add(p);
    }

    public boolean implies(Permission p) {
        for (Iterator<Permission> i = perms.iterator(); i.hasNext();) {
            if (((Permission) i.next()).implies(p)) {
                return true;
            }
        }
        return false;
    }

    public Enumeration<Permission> elements() {
        return Collections.enumeration(perms);
    }

    public boolean isReadOnly() {
        return false;
    }

}
于 2012-08-01T13:39:52.917 に答える
2

あなたの

newAllPermission()).newPermissionCollection()

は、Java によって不変として扱われます (既にすべてのアクセス許可を許可しているコレクションにアクセス許可を追加するのはなぜですか?)。これは、Java がコレクションにアクセス許可を追加しようとするためです。それがエラー メッセージの原因です。Java は、java.io.FilePermission を AllPermission に追加しようとしました。

代わりに、次のようにします。

class MyPolicy extends Policy {
    @Override
    public PermissionCollection getPermissions(CodeSource codesource) {
        Permissions p = new Permissions();
        p.add(new PropertyPermission("java.class.path", "read"));
        p.add(new FilePermission("/home/.../classes/*", "read"));
        ... etc ...
        return p;
    }
}
于 2014-10-20T22:17:32.740 に答える
1

SecurityManager をインストールしないでください。コードベース機能を使用している場合にのみ必要です。必要な場合は、適切な .policy ファイルが必要です。

于 2012-07-31T13:01:05.287 に答える