2012-02-24 4 views
1

私は現在、JBoss 5.0で動作する共通のサービスにアクセスするいくつかのWebアプリケーションを用意しています。 GuiceとPOJOを使って、このサービスは非常に簡単です。 Webアプリケーションは認証され、ユーザーが誰で、どの役割を持っているのかがわかります。サービスを呼び出すときに、この認証情報をどのようにサービスに渡すべきですか?Javaのアプリケーションレイヤ間でサブジェクト/プリンシパル/ロールをどのように渡す必要がありますか?

単純なアプローチは、インターフェイスにパラメータを追加してユーザー情報を取得するだけのようです。おそらく科目。しかし、これは、手元の仕事に特化していない文脈情報とのインターフェースを混乱させるという欠点があります。

void doSomething(Subject subject, ...) { 
} 

私が見てきた代替は、ThreadLocalのストレージを使用する呼び出しを行う前に、そこにユーザー情報を入れて、サービスを使用することができ、いくつかのユーティリティクラスを経由して、これがアクセスできるようにすることです。これにより、インターフェイスがクリーンアップされますが、コールする前にサービスのクライアントがユーザー情報を設定する必要があることが隠されます。

これを行う別の方法はありますか?私はAOPがここでも使われているかもしれないと感じているが、どうやって見えるのか分からない。私は行方不明のいくつかの "ベストプラクティス"がありますか? EJBは役に立ちますか?

+0

私は以来、この問題に対処し、[Apacheの史郎](http://shiro.apache.org)に遭遇してきました。方法はわかりませんが、それはそれを行います。 – pauli

答えて

1

これは、電話をかける前に、 サービスのクライアントがユーザー情報を設定する必要があるという事実を隠します。

Trueですが、アプリケーション全体で特定のメソッドに何かを渡す必要がある場合は、Dependency Injectionの使用目的を無効にします。そこにはサービスやオブジェクトの束を他のサービスやオブジェクトなどに渡す必要がないため、必要なものすべてが作成されます。

別の方法がありますか?私はAOPがここでも使用の かもしれないという感情を得るが、どうしてそんなに見えない。いくつかの "ベストプラクティス"はありますか? 私は行方不明ですか? EJBは役に立ちますか?

これを行うもう1つの方法は、サブジェクト/ユーザーが必要なサービスを呼び出すすべてのサーブレットで単一のフィルタを使用することです。フィルターにユーザーを設定し、最後にtry-finallyブロックでユーザーをクリアします。実際には、OWASP EsapiはThreadLocalUserを設定するときにこのスタイルを使用します。これにより、ユーザーはアプリケーションのすべての部分で利用できるようになります。

このような何か:

@Singleton 
public MyUserFilter extends FilterOfTheMonth { 

    private final Provider<Authenticator> authProvider; 

    @Inject 
    MyUserFilter(Provider<Authenticator> auth) { 
     this.authProvider = auth; 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws java.io.IOException, ServletException { 
     try { 
      // Authenticate and SET the current user utilizing the request and/or      
      // session objects 
      authProvider.get().authenticateUser(HttpRequest currentRequest); 

      // Continue on here along the servlet chain 
      ... other processing 
     } finally { 
      authProvider.get().getRidOfCurrentUser(); 
     } 
    } 
} 
+0

あなたは正しいです、依存症注入は行く方法です。私はそれをWebアプリケーション全体とサービスの中ですでに使用していますが、2つは完全に別々のものなので、あなたの提案をするのはそれほど単純ではありません。私はあなたの提案のような認証プロバイダーにDIを行い、次にimplの情報を設定/アクセスするためにスレッドのローカルストレージを使用します。これは、DI'ed認証プロバイダを使用するだけなので、サービスから隠されます。 – pauli

+0

あなたはそうです。 Owasp ESAPIは現在、DIを利用したAPIを作成しようとしています。私は、AuthImpl内の他のすべてがスレッドセーフであることを確認し、ステートフルなシングルトンを使用する場合はScope-Widening Injectionの危険性について忘れないでください。がんばろう。 – oberger

0

認証プロセスを共通サービスに移行することを検討しましたか?次に、共通サービスにセッションIDが必要なだけで、要求が送信されたユーザーに関するすべての情報が識別されます。

関連する問題