- PR -

java.io.FilePermissionの問題で困っています。

投稿者投稿内容
パルプ
ベテラン
会議室デビュー日: 2003/06/18
投稿数: 59
投稿日時: 2003-08-27 20:28
お世話になっております。スガです。

現在、appletを通してクライアント側で印刷する
アプリケーションを組んでいるのですが、
その印刷ページの描画の際、画像を読み込もうとすると、
以下のようなパーミッションに関する例外が発生します。

java.security.AccessControlException: access denied (java.io.FilePermission a.gif read)

そこでパーミッションを与えるためにjava.policyおよびcatalina.policyに、

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

という記述を施し、SecurityManagerを起動したのですが、効果がありません。

そもそもJavaのパーミッション権限、セキュリティについて
まだまだ曖昧なところが多く、行き詰ってしまいました。

環境は、

 OS: RedHatLinux 7.3
 JDK: j2sdk-1.4.2
 Tomcat: jakarta-tomcat-4.1.24

となっています。

また、この件で以下のサイトを参考にしました。

http://java.sun.com/j2se/1.3/ja/docs/ja/guide/security/PolicyFiles.html

何らかのアドバイス・ヒントが頂ければ幸いです。
皆さま、よろしくお願いします。
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-08-27 21:02
こんばんは。殆どあてにならないレスだと思ってください。
もし、ローカルマシン上でテストしているとして、画像ファイルのアドレスを
プログラム中で絶対パス指定していた場合、
http://127.0.0.1/a.gif
に対して、アプレットの呼び出しを
http://localhost/applet.html
とした場合、引っ掛かったような気がします。いずれかにドメイン名が統一してあれば
この例ではないですね。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-08-27 21:19 ]
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-08-28 09:49
 画像読み込み時に例外が出ると考えられるのは、
1.画像がローカル側にある(パスがc:\sample.gifとかしてある場合)。
  理由:アプレットはローカルには一切アクセスできない。
2.画像がサーバーに置かれているが、アプレットがダウンロードされたサーバーと異なる
  理由:アプレットはダウンロードされたサーバーとしか通信できない。
のどちらかだと思います。
2の場合もメッセージが同じだったかどうかはちょっと覚えていないですが。

 動かすだけなら、私の環境を例に説明すると、
C:\Program Files\Java\j2re1.4.1\lib\security\java.policyの末尾(”}”の前)に、
 permission java.security.AllPermission;
を追加すればアプレットの全ての制限が外れますので動きます。

 仕様として、もし画像がローカルにあるなら、
アプレットを署名付きアプレットにしたほうが良いかもしれません。
パルプ
ベテラン
会議室デビュー日: 2003/06/18
投稿数: 59
投稿日時: 2003-08-28 12:00
Ken-Labさん、takuさん、ありがとうございます!

やりたいことが不明確でしたので情報を捕捉させていただきますね。

開発環境としてはサーバ上でtomcatを使用して行っています。
アプレットも画像も、そのサーバ上の同じプロジェクト内のディレクトリにあります。
つまり、アプレットは同じサーバ上にある画像を参照しています。

takuさんにご教示いただいた方法で、アプレットの全ての制限を外しました。
しかし相変わらずアクセス拒否されたままです。(嗚呼!)

そこでSecurityManagerの実行方法について確認させてください。
java.policyの設定変更後、tomcatを-securityオプションを付けて再起動することで
設定が反映されるものと考えているのですが、合っていますでしょうか?
もし他にやるべき手順などがあれば、ご教示いただけると嬉しいです。

appletおよびhtmlのソースを公開させていただきます。(抜粋です)

コード:

applet(/hoge/applet/PrintApplet.java):

  // a.gifも同じディレクトリにあります
  Image image = getToolkit().getImage("a.gif");
  g.drawImage(image, 0, 0, 30, 30, new PrintApplet());


html(/hoge/html/applet.html):

  <applet codebase="../" code="applet.PrintApplet" width="100" height="100">
  </applet>



Ken-Labさん、takuさんのアドバイスから、パスが不安なのですが
もしかしてこのようなパスの指定だと別サーバ扱いとかになるんでしょうか?

初心者ゆえ、分からないことが多く質問だらけですが、
よろしくお願いしますです!
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-08-28 13:16
本質がわかっていない部分があって理論的な回答を示せませんが、
getToolkit().getImage(FileName) が使えない可能性があるかもしれません。
(認識を誤っている恐れがありますので識者のフォローをお願いします。)
自分の場合、いずれかを使っています。

1.URLオブジェクトを使う。
import java.net.*;
(以下省略)
URL url = new URL ("http://192.168.0.2/a.gif");
Image image = getImage(url);

2.getClass().getResource(FileName)を使う。
Image image = Toolkit.getDefaultToolkit().createImage (getClass().getResource ("a.gif"));

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-08-28 13:27 ]
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-08-28 13:39
引用:

スガさんの書き込み (2003-08-28 12:00) より:
takuさんにご教示いただいた方法で、アプレットの全ての制限を外しました。
しかし相変わらずアクセス拒否されたままです。(嗚呼!)


確認なのですが、操作をしているクライアントでこの操作をしたのですよね?
当然ですが、サーバー側でこの設定を行っても駄目ですよ。
私のところでは下記で、画像の表示が行えます。
//画像表示アプレットのサンプル
import java.awt.*;
import javax.swing.*;

public class ImageApplet extends JApplet{

public void init(){
Container contentPane = getContentPane();
JLabel imageLabel = new JLabel(new ImageIcon(getCodeBase()+"sample.jpg"));

contentPane.add(imageLabel);
}

}

引用:

そこでSecurityManagerの実行方法について確認させてください。
java.policyの設定変更後、tomcatを-securityオプションを付けて再起動することで
設定が反映されるものと考えているのですが、合っていますでしょうか?
もし他にやるべき手順などがあれば、ご教示いただけると嬉しいです。


アプレットで何故、Tomcatが出てくるのでしょうか?
アプレットがサーバー上のTomcat上に置かれていても、
アプレットが動くのは、あくまでもクライアントなので、
サーバー上のTomcatは関係ないのですが。
パルプ
ベテラン
会議室デビュー日: 2003/06/18
投稿数: 59
投稿日時: 2003-08-28 15:05
Ken-Labさん、takuさん、再びのアドバイスありがとうございます!

先に結果を申し上げますと、無事に画像の描画、印刷を行うことができました。
お二人には感謝の気持ちでいっぱいです。本当にありがとうございました!

解決に至った経緯なのですが、先にtakuさんが指摘されていたとおり、
私のアプレットに対する勘違いが原因だったため、認識を改めることで
上手くいくようになりました。

> takuさん

恥ずかしい話ですが、アプレットがクライアント側にダウンロードされて
実行されているにも関わらず、policyについてはサーバ側のことばかり考えていました。
そのせいでtomcatの話を出してしまったわけです。すいません。。

画像がサーバ上にあるので、サーバ側でパーミッションの設定を
しなければいけないかと勝手に思い込んでました。
でも、実際はアクセスする側に許可しなくちゃいけないんですよね。
この辺の認識がグチャグチャになってたのが問題だったみたいです。


> Ken-Labさん

getClass().getResource()を使用する方法は知らなかったので、
とても参考になりました。今後、いろいろ応用できそうですね。
私は初心者でToolkitクラスにあるがままメソッドを使用していたのですが、
それでは上手くいかないとは知りませんでした。
これはちょっと奥が深そうですね…。

> takuさん、Ken-Labさん

初めてのアプレットで右往左往するなか、お二人のアドバイスは
とても勉強になりました。ありがとうございました!
今後ともよろしくお願い致します。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-08-28 15:22
引用:

スガさんの書き込み (2003-08-28 15:05) より:
Ken-Labさん、takuさん、再びのアドバイスありがとうございます!

先に結果を申し上げますと、無事に画像の描画、印刷を行うことができました。
お二人には感謝の気持ちでいっぱいです。本当にありがとうございました!

解決に至った経緯なのですが、先にtakuさんが指摘されていたとおり、
私のアプレットに対する勘違いが原因だったため、認識を改めることで
上手くいくようになりました。


 結局、アプレットのセキュリティを外すことで、動作したようですが、
そのままで宜しいのでしょうか?
(私は動かすだけならと前置きしたはずです。)
各クライアントのセキュリティを、手動で外すのは非現実的ですし、
セキュリティ上非常に危険です。
以前にも述べましたが、署名付きアプレットにする必要があるのでは?

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