我試圖檢索當前正在JAAS框架下執行特權操作的主題,以便能夠提取其主體。基本上,我需要在運行時驗證特權操作確實由有權這樣做的主體執行。在運行時檢索執行java.security.PrivilegedAction的主題
或者換句話說:是否有可能在運行時將當前的LoginContext作爲某種系統屬性(而不是創建新的)?這很容易提取主題。
我試圖檢索當前正在JAAS框架下執行特權操作的主題,以便能夠提取其主體。基本上,我需要在運行時驗證特權操作確實由有權這樣做的主體執行。在運行時檢索執行java.security.PrivilegedAction的主題
或者換句話說:是否有可能在運行時將當前的LoginContext作爲某種系統屬性(而不是創建新的)?這很容易提取主題。
我想你需要自己管理這樣的機制。例如,如果這是一個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);
}
}
}
您確定您需要登錄上傳?
如果你只需要主題(所有附帶校長),你可以做
Subject activeSubject = Subject.getSubject(AccessController.getContext());
是的,我也開始覺得這是我必須做我自己。雖然這有點令人驚訝。 – user525742 2010-11-30 22:19:37