在运行时检索执行java.security.PrivilegedAction的主题

在运行时检索执行java.security.PrivilegedAction的主题,java,authorization,jaas,Java,Authorization,Jaas,我试图检索当前正在JAAS框架下执行特权操作的主题,以便能够提取其主体。基本上,我需要在运行时验证特权操作是否确实由有权这样做的主体执行 或者,换言之:是否可以在运行时将当前LoginContext作为某种系统属性获取(而不是通过创建新属性)?这将很容易提取主题。我认为您需要自己管理这样的机制。例如,如果这是一个web应用程序,您在其中进行一次身份验证,然后将身份验证与会话相关联。在会话中存储LoginContext。使其在代码的其他部分可用的一个技巧是创建一个线程本地包装器,您可以在每次线程调

我试图检索当前正在JAAS框架下执行特权操作的主题,以便能够提取其主体。基本上,我需要在运行时验证特权操作是否确实由有权这样做的主体执行


或者,换言之:是否可以在运行时将当前LoginContext作为某种系统属性获取(而不是通过创建新属性)?这将很容易提取主题。

我认为您需要自己管理这样的机制。例如,如果这是一个web应用程序,您在其中进行一次身份验证,然后将身份验证与会话相关联。在会话中存储
LoginContext
。使其在代码的其他部分可用的一个技巧是创建一个线程本地包装器,您可以在每次线程调用(例如请求)的开始/结束时设置/取消设置该包装器

public类LoginContextHolder{
私有静态ThreadLocal ctx=new ThreadLocal();
公共静态无效集(LoginContext lc){
ctx.set(lc);
}
公共静态登录文本获取(){
返回ctx.get();
}
}
公共类LoginContextFilter实现筛选器{
public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain链){
LoginContext ctx=null;
HttpSession sess=(HttpSession)((HttpRequest)请求).getSession(false);
如果(sess!=null){
ctx=(LoginContext)sess.getAttribute(“ctx”);
}
试一试{
LoginContextHolder.set(ctx);
链式过滤器(请求、响应);
}最后{
LoginContextHolder.set(空);
}
}
}

您确定需要登录文本吗

如果您只需要主题(包含所有附加的主体),您可以这样做

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

是的,我也开始认为这是我必须自己做的事情。不过,这有点令人惊讶。我怀疑他们将这方面完全留给了用户。何时创建LoginContext的语义是完全特定于应用程序的-使用X.509 SSL证书身份验证是非常不同的,每次套接字重新连接到用户名/密码登录页面时都会发生这种情况。
 Subject activeSubject = Subject.getSubject(AccessController.getContext());