2010-11-30 36 views
3

我試圖檢索當前正在JAAS框架下執行特權操作的主題,以便能夠提取其主體。基本上,我需要在運行時驗證特權操作確實由有權這樣做的主體執行。在運行時檢索執行java.security.PrivilegedAction的主題

或者換句話說:是否有可能在運行時將當前的LoginContext作爲某種系統屬性(而不是創建新的)?這很容易提取主題。

回答

0

我想你需要自己管理這樣的機制。例如,如果這是一個Web應用程序,您需要驗證一次,然後將身份驗證與會話相關聯。您在會話中存儲LoginContext。讓代碼的其他部分可用的一個技巧是在每個線程調用的開始/結束(例如請求)中設置/設置一個線程本地包裝器。

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 2010-11-30 22:19:37

3

您確定您需要登錄上傳?

如果你只需要主題(所有附帶校長),你可以做

Subject activeSubject = Subject.getSubject(AccessController.getContext());