我正在尝试检索当前在JAAS框架下执行特权操作的主题,以便能够提取其主体。基本上,我需要在运行时验证特权操作确实是由有权这样做的委托人执行的。
或者,换句话说:是否可以在运行时将当前的LoginContext作为某种系统属性(而不是通过创建新属性)?这很容易提取主题。
答案 0 :(得分:3)
您确定需要LoginContext吗?
如果您只需要主题(所有附加的校长),您可以
Subject activeSubject = Subject.getSubject(AccessController.getContext());
答案 1 :(得分: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);
}
}
}