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

时间:2010-11-30 21:20:22

标签: java authorization jaas

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

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

2 个答案:

答案 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);
       }

    }


}