2010-11-30 27 views
3

JAASフレームワークの下で特権アクションを現在実行しているサブジェクトを取得しようとしています。サブジェクトを取得できるようにしています。基本的には、私は実行時にPrivileged Actionが実際にそのような権利を持つプリンシパルによって実行されることを確認する必要があります。実行時にjava.security.PrivilegedActionを実行するサブジェクトを取得する

または、別の言い方をすれば、現在のLoginContextを実行時に何らかのシステムプロパティ(新しいものを作成することなく)として取得できますか?これにより、Subjectを簡単に抽出できます。

答えて

0

このようなメカニズムを自分で管理する必要があると思います。たとえば、これが一度認証されてから、認証をセッションに関連付けるWebアプリケーションの場合です。セッションにLoginContextを格納します。コードの他の部分で使用できるようにする1つの方法は、すべてのスレッド呼び出し(要求など)の開始時または終了時に設定または設定解除するスレッドローカルラッパーを作成することです。

public class LoginContextHolder { 

    private static ThreadLocal<LoginContext> ctx = new ThreadLocal<LoginContext>(); 

    public static void set(LoginContext lc) { 
     ctx.set(lc); 
    } 

    public static LoginContext get() { 
     return ctx.get(); 
    } 

} 


public class LoginContextFilter implements Filter { 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 

     LoginContext ctx = null; 
     HttpSession sess = (HttpSession)((HttpRequest)request).getSession(false); 
     if (sess != null) { 
      ctx = (LoginContext)sess.getAttribute("ctx"); 
     } 

     try { 
     LoginContextHolder.set(ctx); 
      chain.doFilter(request, response); 
     } finally { 
     LoginContextHolder.set(null); 
     } 

    } 


} 
+0

を行うことができますはい、私はまた、これは私が自分自身をしなければならない何かであることを考え始めました。しかし、それは少し驚くべきことです。 – user525742

+0

私はそれらがユーザーに完全にそのアスペクトを残すと思う。 LoginContextを作成するときのセマンティクスは完全にアプリ固有です.X.509 SSL証明書の認証を持つことは非常に異なります。これは、すべてのソケットがユーザー名/パスワードのログインページに再接続する際に発生します。 –

3

本当にあなたはLoginContextが必要ですか?あなただけ(取り付けられているすべてのプリンシパルで)件名が必要な場合は

することは、あなたは

Subject activeSubject = Subject.getSubject(AccessController.getContext()); 
関連する問題