JAVA Swingクライアント、リモートデータベースへのデータアクセス。イバティス
-
05-07-2019 - |
質問
リモートデータベースにアクセスする必要のあるJavaクライアントがあります。ユーザーからデータベース資格情報を非表示にし、コード内の資格情報をハードコーディングしないことが目標です。したがって、データベースアクセスはおそらくサーバー側で行う必要があります。
Ibatisをデータ抽象化フレームワークとして使用することに制限されています。それとは別に、WebサーバーでJBossを実行しているため、データソースを使用できます。
リモートデータベースアクセスとデータのシリアル化/逆シリアル化をどのように設計しますか。ソケットよりも何らかのデータストリームのWebサービスを好むでしょうか?どちらをどうやって実現しますか?
解決
サービス層を構築し、RMIを介して公開します。JBossのようにEJB3ステートレスセッションBeanとして、場合によっては純粋なRMIとして公開します。特別な必要がない限り、私はウェブサービスを気にしません。 RMIがシリアル化のケースを取り上げます。
サービスレイヤーは、Swingアプリの起動時に入力された資格情報を使用してユーザーを認証するメソッドを公開する必要があります。データの呼び出しはすべてサービスレイヤーを経由します。 SwingアプリにはSQLは存在しません。
このアレンジメントには、データベースの資格情報を単に隠すこと以外の利点もあります。階層化されたアーキテクチャになるだけでなく、サーバー上に単一のデータソースを持つことで、すべてのクライアント間で準備済みステートメントを共有することで効率が向上します。
他のヒント
では、ユーザーが資格情報を知らなくてもデータベースにアクセスできるようにしたいですか?唯一のオプションは、サーバー側のデータベースアクセスです。残念ながら、Javaでユーザー名とパスワードを非表示にする方法はありません。プロパティファイルに入れて暗号化すると、攻撃者がデバッガをアタッチして、コードに保持されている値を確認できます。
また、安全な接続を介してDBに接続している場合を除き、誰かがtcpdumpなどのパケットスニファを実行し、そこで資格情報を取得できます。
JBossサーバーを実行していると言いますが、クライアントアプリケーションがデータベースに直接アクセスしないようにリモートEJBをセットアップするのが最善かもしれません-EJBメソッドを経由する必要があります。 (これはEJBである必要はありません。必要に応じて、Webサービスなどを実行できます。)
ポイントは、サーバーがデータベースと直接通信し、クライアントの唯一のアクセスは、サーバー上で定義した限られたインターフェースのセットを経由することです。
すでに述べたように、データベース接続を処理するサーバーに接続する必要があります。 30分間の努力で、誰かがセキュリティを破るのを効果的に防ぐ方法はありません。
クライアントがイントラネット内である程度ローカルに接続している場合、アプリサーバーでEJBを使用するのがおそらく最良の選択です...おそらくステートレスセッションBeanが必要ですが、メッセージ駆動型Beanは必ずしも割引きません。
トラフィックが外部から来るより長い距離では、HTTPS経由のWebサービスを使用します
いずれにしても、ほとんどのアプリサーバーには、WSDLを使用してEJBをWebサービスとして公開するメカニズムがあります。また、WSDLからクライアントを生成し、Webサービスを呼び出すためのユーティリティが約100個あります(軸のwsdl2javaは十分に機能します)