これは簡単な質問ではありません。私は、ログインとセキュリティでEJB 3.0サービスを保護するためのアーキテクチャーを再考しているからです。rmi ejbコールの再利用可能なログインセッションのコンセプト
私たちは、JBoss 5.1上にEJB3.0アプリケーションを用意しています。このアプリケーションは、SWTクライアントにさまざまなサービスを提供し、データの読み書きを行います。サービスを使用するには、クライアントは、有効なユーザーとパスワードを使用してログインする必要があります。有効なユーザーとパスワードは、LDAPサーバーでSpringSecurityによって参照されます。 SpringSecurityはセッションIDを生成します。セッションIDは、それ以降のサービス呼び出しで再利用されるようにクライアントに返されます。
client server
| |
|-> login(user/password)-------->|
| |
| <------- sessionId ------------|
| |
|-->serviceXy(sessionId,param1)->|
状況は明らかです。各サービスメソッドの最初のパラメータである独自のコンテキストオブジェクトにsessionIdを格納します。各サービスメソッドには、指定されたコンテキストオブジェクトからsessionIdを読み込み、セッションがまだ有効かどうかを調べるインターセプタがあります。クライアントはsessionIdでいっぱいになったコンテキストオブジェクトを取得するためにログインサービスを最初に呼び出す必要があり、以後のサービス呼び出しでこのコンテキストオブジェクトを再利用する必要があります。
public class OurContext {
private String sessionId;
}
@Stateless
@Interceptors(SecurityInterceptor.class)
public OurServiceImpl implements OurService {
public void doSomething(OurContext context, String param1) {
[...]
}
}
このソリューションで私が気に入らないのは、コンテキストパラメータを使用して各サービスメソッドを分類することです。 rmi呼び出しでhttpセッションのような同様のメカニズムはありませんか?私はコンテキストオブジェクトを、ログイン直後のクライアント(?)で作成されたある種類のセッションに入れ、SecurityInterceptorがこの "魔法のコンテキスト"からsessionIdを読むことができるように各サービス呼び出し時にサーバーに渡すことを考えています"
このような何か:
OurContext ctx = service.login("user","password");
Magical(Jboss)Session.put("securContext", ctx);
service.doSomething("just the string param");
あなたの答えについて多くのことを考えた後、私はより良い解決策を見つけることができないと認めなければなりません。だから、私たちは政治的理由でコンテキスト・シナリオを維持します、hrmpf – martin