- PR -

Javaアプレットを使用したDB接続について(Web上)

投稿者投稿内容
hayato_amz
会議室デビュー日: 2006/11/26
投稿数: 6
お住まい・勤務地: 東京・港区
投稿日時: 2006-11-26 15:05
はじめて投稿致します。よろしくお願い致します。
現在Javaアプレットを使用して、Web上からDB(oracle)へJDBCを介してアクセスし、
マスターテーブルを管理するプログラムを作成しております。
そこで問題が1つ起きてしまい大変困っております。
その問題とは、開発PCのローカルマシンからAppletViewerでDBへの
アクセスは成功するのですが、それをWeb上に展開し、そこからDBへアクセスを行うと
下記の例外がスローされてしまいます。
(Javaコンソールより)
java.security.AccessControlException: access denied (java.util.PropertyPermission oracle.jserver.version read)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:436)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:314)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at common.db.DBConnection.con(DBConnection.java:100)
at common.db.DBConnection.<init>(DBConnection.java:64)
at mstmnt.serch.Search.SearchConnect(Search.java:40)
at mstmnt.MasterMaintenance.getJTable(MasterMaintenance.java:348)
at mstmnt.MasterMaintenance.getJScrollPane(MasterMaintenance.java:321)
at mstmnt.MasterMaintenance.getJContentPane(MasterMaintenance.java:119)
at mstmnt.MasterMaintenance.init(MasterMaintenance.java:102)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

内容を見ると、アプレット側のセキュリティで引っかかっているようです。
それおもOracleに接続する際のパーミッションの設定に関係しているのでしょうか?
それそも、アプレットを使用したWebアプリからでは、DBにアクセスすることは不可能
なんでしょうか?
ちなみに、アプレットとDBは別々で異なるマシン上にあります。
色々調べてみましたが、中々有用な情報が見つかりませんでした。
大変申し訳ありませんが、皆様方の中で何か分かる方がいらっしゃいましたら
ご教授願えないでしょうか?リリースもやや近くなっており、少し焦っております。

■開発環境
1.アプレット側
・OS : WindowsXP
・J2EEアプリケーションサーバー:TOMCAT 5.0.28
・開発言語:Java(J2SE5.0)
・ソフト:Oracle9i client(9.2)


2.DB側
・OS : Windows 2003 Server
・DBサーバー:Oracle 10g

以上、よろしくお願い致します。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2006-11-26 15:18
こんにちは。

Javaアプレットは、サンドボックスというセキュリティモデルで動作します。
サンドボックス 【sandbox】

Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2006-11-26 16:10
こんにちは。

追記です。
私なりに調べてみたところ
「Oracle Thin JDBCドライバ」というのを使えば、
Javaアプレット からDB接続できるらしいですが…!??

http://kamakura.cool.ne.jp/oppama/swjd/orathinjdbcapplet.html

Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2006-11-26 16:22
こんにちは。
さらに追記です。

ここに書いてありますね。
Javaデータアクセスの基礎
タイプ4:ネイティブ・プロトコル・ドライバ

hayato_amz
会議室デビュー日: 2006/11/26
投稿数: 6
お住まい・勤務地: 東京・港区
投稿日時: 2006-11-26 16:35
Tdnr_Symさん、こんにちは。早速のご回答ありがとうございました。
又、追加で調べて頂きありがとうございます。

今、thinドライバで繋いでおらず、OCIドライバで繋いでおります。thinでも
試した方がよいのかもしれませんね。
あと、参照頂いたHPには「Oracleインスタンスが上がっているデータベースサーバとWebサーバは同じマシンでないといけない」とありました。
今は、DBサーバーとWebサーバーは別々の為、DBに接続できない現象が起きているのかも
しれません。

私も追加で調べてみたのですが、アプレットはサンドボックス内で動いている為、
外部のリソースにアクセスできないみたいですね。

そこで、サンドボックスからアプレットを出せばよいのかなと思い、
ネットで調べてみたところ、署名付きのアプレットにすればサンドボックス
から外れるような記事を見つけました。

以上のことから、署名付きアプレットにする=外部DB接続可能に
なるのかなと考えました。

会社に開発環境があり今すぐ試すことができない為、教えて頂いたことが
今すぐ試せないのが惜しいのですが。。
もし、他にもお気づきの点がありましたらご教授頂けると助かります。
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2006-11-26 22:43
ポリシーファイルに必用なパーミッションを記述して
それをクライアントに配布する方法も考えれられるかと
思います。

%userprofile%\\.java.policyファイルを作成して
以下のように必用となるパーミッションを記述していけばよいと思います。

grant codeBase "http://Webサーバのホスト名:ポート番号/パス/-" {
permisson java.util.PropertyPermission oracle.jserver.version read;
}
上記以外にも必用となるパーミッションはあると思いますので
java.security.AccessControlException
の後に表示されるパーミッションを失敗する都度、追加していきます。

まずは、all permissionで試してみて、本当に接続できることを確認し
その後、お客様の運用に合せて、ポリシーファイルの配布か、アプレット
署名にするかをご検討されればよいかと思います。

hayato_amz
会議室デビュー日: 2006/11/26
投稿数: 6
お住まい・勤務地: 東京・港区
投稿日時: 2006-11-26 23:34
つばささん、こんにちは。ご回答ありがとうございます。

まず、今日分かったこととして、
1.アプレットではthinドライバを使用してDB接続を行うこと。
2.その際、つばささんの仰っているポリシーファイルでパーミッションを
制御、又は署名付きアプレットにしてセキュリティー制限を外すこと。

この2点です。恐らく上記の2点の手順を踏まなければアプレット→DBサーバーへ
の接続はできないことまではわかりました。

明日は、thinドライバで接続をするアプレットへ変更し、ポリシーファイルの
パーミッションを「all permission」にして、改めてDBアクセスを試して
みます。

つばささん、Tdnr_Symさんのお陰でなんとか光が見えてきたように思います。
結果はまた別途報告させて頂きます。本当にありがとうございました。
hayato_amz
会議室デビュー日: 2006/11/26
投稿数: 6
お住まい・勤務地: 東京・港区
投稿日時: 2006-11-27 17:30
結果を報告致します。

まず、
1.thinドライバに変えてポリシーファイルを作成せずにDBにアクセス→NG
2.thinドライバに変えてポリシーファイルを作成。この時、パーミッションは
「all permission」にしてDBへアクセス→OK
3.thinドライバに変えてアプレットとclasses12.jarに署名を付けてDBへアクセス
→OK

以上の結果がでました。とにかく、DBにアクセスすることができました!
Tdnr_Symさん、つばささん本当にありがとうございました。

又、試しに上記2.と3.にociドライバでDBアクセスを行ってみたところ
うまくいきました。(何故だかわかりませんが・・)

ちなみに、アプレットからDBアクセスする際のリファレンスHPがありました。
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/java.102/B19275-02/jdbcthin.htm

あと、私と同じ問題に当たった人の為にポリシーファイルの作成方法と署名付き
アプレットの作成方法を記述しておきます。参考にして下さい。
1.ポリシーファイルの作成
      以下の内容を含む、.java.policyファイルを作成します。
       grant {
        permission java.security.AllPermission;
       };
配置する場所は、「「C:\Documents and Settings\{ユーザID}\」です。
※Windowsでは、「.」で始まるファイル名作成できません。その為、
  最初に適当な名前でポリシーファイルを作成し、DOSプロンプトから
COMMANDでRenameして「.java.policy」として下さい。

2.書名付きアプレットの作成方法
下記のHPを参照して作成しました。
http://mictan.gozaru.jp/java_applet.html

以上、ご協力頂いた方々本当ありがとうございました。

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