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