- PR -

クラスローダの権限設定について

1
投稿者投稿内容
84
ベテラン
会議室デビュー日: 2005/11/04
投稿数: 83
投稿日時: 2008-09-29 22:22
いつもお世話になっております。

クラスローダの権限設定について
質問があって投稿しました。

現在、URLClassLoaderを拡張したクラスローダを使っています。
そのクラスローダに親と同じ権限を与えたいと思っています。

getPermissions(CodeSource codesource)メソッドを継承して
そこでパーミッションを追加すれば
権限は自由に付与することができました。
ただ、与える方法はわかっても、
与えるべきパーミッション(親のパーミッション)の取得ができません。

リフレクションを使えば強引にできると思うのですが、
それ以外の方法で
親から子へ権限を簡単に委譲できる方法はないでしょうか?

どなたかご存知の方いらっしゃいましたら教えてください。
以上、よろしくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-09-29 23:45
質問の意味を勘違いして答えているかもしれませんが、
コード:
protected PermissionCollection getPermissions(CodeSource codesource){
    //親クラスローダを取得
    ClassLoader loader = getParent();
    if(!(loader instanceof SecureClassLoader)){
        //親クラスローダがSecureClassLoaderのサブクラスじゃなければ諦める
        return super.getPermissions(codesource);
    }

    //親へ委譲
    SecureClassLoader secureLoader = (SecureClassLoader) loader;
    return secureLoader.getPermissions(codesource);
}


って感じでどうでしょう?

単にgetPermissionsをオーバーライドして、親クラスローダを取得、
親がSecureClassLoaderのサブクラスなら、
その親クラスローダのgetPermissionsを呼び出し、
違うなら、nullを返すだけの実装で要件は満たせるのではと思います。

親のパーミッションを取得するのではなく、
親に権限のチェックを委譲するという考え方です。
84
ベテラン
会議室デビュー日: 2005/11/04
投稿数: 83
投稿日時: 2008-09-30 10:26
回答ありがとうございます!

>質問の意味を勘違いして答えているかもしれませんが、
とんでもないです。
期待通りの回答です。

ただ、その方法は検討してみたのですが、
SecureClassLoader#getPermissions(codesource)は
protectedメソッドなので、
以下の箇所でコンパイルエラーになります…。

return secureLoader.getPermissions(codesource);

よろしくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-09-30 12:17
引用:

ただ、その方法は検討してみたのですが、
SecureClassLoader#getPermissions(codesource)は
protectedメソッドなので、
以下の箇所でコンパイルエラーになります…。


あー、そうですね。。。失礼しました。
(コンパイルせずに書きました。。。反省です。)

権限情報を一定の規格で管理しているわけではないので、
親がどのように権限チェックしているかについては、
クラスローダの実装次第でしょう。
ですので、結局のところ親のメソッドを呼ぶしかないのではないでしょうか。
となると、リフレクションになってしまいます。
期待に添えなくて、すみません。
84
ベテラン
会議室デビュー日: 2005/11/04
投稿数: 83
投稿日時: 2008-09-30 12:52
かつのりさん

いろいろ調べていただいてありがとうございました。
やはりリフレクションを使うしか手がないのですね。。。

親のクラスローダが参照しているパーミッションファイルがあるので
それを解析して、同じパーミッションを与えるようにしました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)