ポリシーファイルによる権限の設定

policytool による編集

まず policytool を使って、ポリシーを設定し、ファイルに対する読み取り許可を設定してみます。
J2SDK, J2RE に付属の policytool.exe を起動します。
ポリシーツール起動

初めて policytool を起動する場合は、.java.policy ファイルがホームディレクトリに存在しません、というダイアログが表示されますが、これから作成しますので、気にせずに [了解] をクリックします。
ポリシーツール初期警告

[ポリシーエントリの追加]をクリックします。
ポリシーエントリー追加

[アクセス権の追加]をクリックします。
アクセス権の追加

コンボボックスから [FilePermission], [<<ALL FILES>>], [read] を選択し、了解をクリックします。
アクセス権設定

[完了] ボタンをクリックします。
アクセス権設定完了

メニュー [ファイル] - [保存] を選択すると保存ダイアログが表示されますので、ホームディレクトリ(*1)に「.java.policy」(*2)という名前で保存します。
これは、デフォルトでは Java VM がホームディレクトリのポリシーファイル(.java.policy)を参照するように設定されているためです。
(例) C:\Documents and Settings\mki\.java.policy
(Windows に mki というユーザでログオンしている場合。)
*1
ホームディレクトリは Windows 2000, XP 等で C:\Documents and Settings 以下に作成される個人別のフォルダのことです。
コマンドプロンプトから
  set userprofile
と入力すると、ホームディレクトリ名が表示されます。
*2
ファイル名はドット(.)で始めます。ドットを付け忘れると無視されますので、注意してください。

アクセス権保存

ポリシー設定が保存されました。
アクセス権保存

この時のポリシーファイル(.java.policy)の中身は次のようになっています。
/* AUTOMATICALLY GENERATED ON Wed Dec 03 15:00:17 JST 2003*/
/* DO NOT EDIT */

grant {
  permission java.io.FilePermission "<<ALL FILES>>", "read";
};

これで Java Applet や JWS からファイル選択ダイアログ(JFileChooser 等)を開いてもエラーが出なくなります。
しかし、これではすべての Java Applet や JWS でファイルを開くことができてしまうため、危険が伴います。
例えば、その Java Applet や JWS が見知らぬホストからダウンロードした、悪意のあるコードであっても、ファイルを読み込むことができてしまいます。
そこで、まず特定の Java Applet だけがファイルを開くことができるように設定してみます。

先ほど作成したポリシーエントリー [CodeBase <ALL>] を選択して、[ポリシーエントリの編集] をクリックします。
アクセス権編集

CodeBase に http://applet.mki.ne.jp/app/- と入力して、[完了]ボタンをクリックし、先ほどと同じ操作で設定を保存します。
Applet codebase 設定

この時のポリシーファイル(.java.policy)の中身は次のようになっています。
/* AUTOMATICALLY GENERATED ON Wed Dec 03 15:13:18 JST 2003*/
/* DO NOT EDIT */

grant codeBase "http://applet.mki.ne.jp/app/-" {
  permission java.io.FilePermission "<<ALL FILES>>", "read";
};

すると今度は、http://applet.mki.ne.jp/app/ 以下からダウンロードしてきた Java Applet だけがファイル選択ダイアログを開くことができるようになります。
しかし、JWS の場合は JAR ファイルをクライアント PC のローカルディスクにダウンロードしてキャッシュしておき、キャッシュされた JAR ファイルを使って起動するため、JAR をダウンロードしたホストの URL を CodeBase 指定しても認識されません。
そこで特定の JWS だけに対して権限を設定する場合は、クライアント PC にキャッシュされたディレクトリ(フォルダ)を指定します。
デフォルトでは JWS のバージョンにより、次のディレクトリ以下にキャッシュされます

JWS のバージョン
ディレクトリ
J2SDK 1.3.1 + JWS 1.0
c:\Program Files\Java Web Start\.javaws\cache
J2SDK 1.4.x に付属の JWS
${user.home}/.javaws/cache (*1)

*1
${user.home} は Java のシステムプロパティで、実行時にログオンしているユーザのホームディレクトリに置き換えて処理されます。

http://jws.mki.ne.jp/app/ からダウンロードした JWS を実行する場合の指定は、それぞれ次のようになります。
J2SDK 1.3.1 + JWS 1.0 の場合は、CodeBase に[file:/C:/Program Files/Java Web Start/.javaws/cache/http/Djws.mki.ne.jp/P80/DMapp/-]と指定します。
JWS codebase 設定

J2SDK 1.4.x に付属のJWS の場合は、CodeBase に[file:/${user.home}/.javaws/cache/http/Djws.mki.ne.jp/P80/DMapp/-]と指定します。
JWS codebase 設定(1.4.x)

このケースでは、
項目

ホスト
jws.mki.ne.jp
ポート
80
WEB アプリケーションの
コンテキストルート
app
から JAR ファイルをダウンロードしますが、キャッシュディレクトリが作成される時、ホスト名の前に [D]、ポートの前に [P]、WEB アプリケーションのコンテキストルートの前に [DM] が付与されます。
CodeBase を設定する前に、実際にキャッシュディレクトリがどのようになっているかをエクスプローラで確認すると、より確実になります。

次に設定を保存します。
この時のポリシーファイル(.java.policy)の中身は次のようになっています。
J2SDK 1.3.1 + JWS 1.0 用に設定した場合
/* AUTOMATICALLY GENERATED ON Wed Dec 03 15:31:23 JST 2003*/
/* DO NOT EDIT */

grant codeBase "file:/C:/Program Files/Java Web Start/.javaws/cache/http/Djws.mki.ne.jp/P80/DMapp/-" {
  permission java.io.FilePermission "<<ALL FILES>>", "read";
};

J2SDK 1.4.x 付属の JWS 用に設定した場合
/* AUTOMATICALLY GENERATED ON Wed Dec 03 15:31:23 JST 2003*/
/* DO NOT EDIT */

grant codeBase "file:/${user.home}/.javaws/cache/http/Djws.mki.ne.jp/P80/DMapp/-" {
  permission java.io.FilePermission "<<ALL FILES>>", "read";
};

すると今度は、http://jws.mki.ne.jp/app/ 以下からダウンロードしてきた JWS だけがファイル選択ダイアログを開くことができるようになります。

よく設定する項目

今回は、すべてのファイルに対する読み取り権限を設定しましたが、他によく使われる項目には、次のようなものがあります。
下記例のようにポリシーファイル(.java.policy)を直接編集しても構いませんが、入力ミスをすると設定が無効になりますので、自信のない方は policytool を使われると良いでしょう。
その場合は、1つ目の項目を [アクセス権]、2つ目の項目を [ターゲット名]、3つ目の項目を [アクション] に設定します。
許可する項目
設定
クリップボードへのアクセスを許可
permission java.awt.AWTPermission "accessClipboard";
警告ステータスバーを非表示
permission java.awt.AWTPermission "showWindowWithoutWarningBanner";
システムプロパティ(user.dir)に設定された値の読み込みを許可
permission java.util.PropertyPermission "user.dir", "read";
c:\temp 以下のファイルに対するすべての操作を許可
permission java.io.FilePermission "c:/temp/-", "read, write, delete, execute";
ホスト app.mki.ne.jp に対するネットワーク接続を許可
permission java.net.SocketPermission "app.mki.ne.jp", "connect, resolve";

(例)
/* AUTOMATICALLY GENERATED ON Wed Dec 03 15:31:23 JST 2003*/
/* DO NOT EDIT */

grant codeBase "file:/${user.home}/.javaws/cache/http/Djws.mki.ne.jp/P80/DMapp/-" {
  permission java.io.FilePermission "<<ALL FILES>>", "read";
  permission java.awt.AWTPermission "accessClipboard";
  permission java.awt.AWTPermission "showWindowWithoutWarningBanner";
  permission java.util.PropertyPermission "user.dir", "read";
  permission java.io.FilePermission "c:/temp/-", "read, write, delete, execute";
  permission java.net.SocketPermission "app.mki.ne.jp", "connect, resolve";
};


このドキュメントの内容は Java 2 SDK 1.4.2_02 での動作をもとに作成していますが、1.3.1, 1.4.0, 1.4.1 でも大きな違いはありません。