代码之家  ›  专栏  ›  技术社区  ›  Matt Sheppard

从Java servlet中模拟用户

  •  2
  • Matt Sheppard  · 技术社区  · 14 年前

    给定一个Java servlet(在Windows服务器上运行),它通过ProcessBuilder创建一个新进程,我有什么选择让新进程作为调用Web Servlet的原始Web请求的用户运行?

    澄清一下,我想要的是

    ProcessBuilder pb = new ProcessBuilder("whoami");
    Process p = pb.start();
    // p.getOutputStream() should contain the name of the remote user,
    // not the user running the app server
    

    真正的目标是执行一些安全检查(例如,查看用户是否能够打开文件,或者在内部企业系统中查看此类记录)。

    显然,用户将需要以某种方式认证,无论是应用服务器还是Java代码——理想地,我希望它能以单点登录的方式工作(也就是说,如果没有用户输入密码),如果解决方案只从已经登录到域的Windows客户端工作(很好,如果不是这样的话)就更好了。限制)。我目前正在使用Jetty作为应用服务器,但如果必要的话,切换到其他应用服务器肯定是一个可行的选择。

    (如果这有助于澄清,我基本上希望替换一个CGI脚本,该脚本当前使用IIS的模拟功能在发出请求的用户上下文中运行)

    2 回复  |  直到 14 年前
        1
  •  6
  •   dB.    14 年前

    项目 Waffle 会带你(几乎)到那里。它实现了SSO和模拟。

        2
  •  2
  •   L. Cornelius Dol    14 年前

    你唯一的选择是JNI,或者像JNA那样的围绕JNI的包装器。您需要调用O/S API来更改有效凭据,这还需要应用服务器以管理员身份运行——这本身就是一个重要的安全考虑因素。

    我不知道Windows API的具体情况,但大多数O/S都具有足够强大的配置文件(admin/root)的能力,可以在不需要密码的情况下假定任何用户配置文件的身份。否则,获取用户配置文件令牌的唯一方法通常是提供该配置文件的合法身份验证凭据。

    要小心的一件事是确保更改线程的凭据,而不是整个进程。