1

私は既存の j2ee アプリに取り組んでおり、ベンダー固有のメソッド呼び出しをコードから削除する必要があります。

セッション ファサードの背後にある daos は、データベースに接続するために、ejb コンテナを呼び出してユーザーの ID とパスワードを取得します。サーバーへの接続に使用される initialContext のユーザー ID とパスワードの部分。

を使用してユーザーIDを取得できますsessionContext.getCallerPrincipal()

とにかくSECURITY_CREDENTIALSサーバー接続で使用されるものに到達する方法はありますか、またはサーバー接続から ejbs に情報を渡す方法はありますか (それらはすべてステートレス セッション Bean です)。

これは、リッチ クライアントと Web フロント エンドの両方を備えた大規模なアプリです。完璧な世界であれば、J2EE セキュリティなどを使用するために、ソリューション全体を再設計して再構築したいと考えていますが、残念ながら、それは現実的ではありません。

4

3 に答える 3

1

一般的な解決策を提供することはできませんが、これが私たちにとってうまくいったことです。他のユーザーの資格情報を要求できる特定のユーザーとして、アプリケーション サーバーを LDAP に接続します。次に、最初のログインからのユーザー ID に基づいて、セッション Bean 内からユーザー資格情報を要求するために使用できる汎用セキュリティ コードをいくつか用意します ( getCallerPrincipal().

また、ユーザー ID をスレッド ローカル変数に配置することで、EJB からコール チェーンを下ったクラスが「コンテナー対応」である必要がなくなります。スレッド ローカルから ID にアクセスし、セキュリティ クラスを使用してユーザー プロファイル情報を検索するだけです。これにより、テスト用に実装を変更したり、LDAP ルックアップ以外のものを変更したりすることも容易になります。

私たちが作成したその他の便利なJDBCServiceLocator機能は、現在のユーザーのユーザー/パスワードを使用して接続を取得する です。したがって、開発者はセキュリティ ルックアップを明示的にコーディングする必要はまったくありません。

于 2008-12-01T18:01:48.810 に答える
0

ロビン、

私が計画していたもののように聞こえます。サーバー接続が成功した直後に呼び出しを行い、資格情報を接続クラスの threadLocal 変数にロードすることにしました。もっと簡単な方法があることを望んでいましたが、そうではないと思います。

于 2008-12-01T19:48:14.210 に答える
0

通常、Java EE セキュリティ モデルでは、セキュリティ上の理由から、ユーザー パスワードの取得は許可されません。しかし、それは実装に依存します。一部のベンダーは、この種の情報を取得する方法を提供していますが、そのような実装に依存する場合、アプリケーションの移植性が損なわれることに注意してください。

一般的なアプローチの 1 つは、サーブレット フィルタを記述してログイン リクエストをインターセプトし、資格情報のコピーを保存して後で使用することです。アプリケーションが Java EE セキュリティ インフラストラクチャを使用していない場合、これは簡単に実装できます。これは、一部のベンダーが認証サーブレットのフィルタリングを妨げているためです。

于 2008-12-01T17:07:46.860 に答える