鉴于Java Servlet(在Windows服务器上运行)通过ProcessBuilder创建一个新进程,我有什么选择让新进程作为调用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作为应用服务器,但如果有必要,切换到其他东西肯定是一个可行的选择。
(如果有助于澄清,我基本上希望替换当前使用IIS的模拟功能的CGI脚本在发出请求的用户的上下文中运行)
答案 0 :(得分:6)
项目Waffle会让你(差不多)在那里。它实施了SSO和模拟。
答案 1 :(得分:2)
你唯一的选择是JNI,或者像JNA这样的JNI包装器。您需要调用O / S API来更改有效凭据,这也需要应用程序服务器以管理员身份运行 - 这本身就是一个重要的安全考虑因素。
我并不特别了解Windows API,但是大多数操作系统都能够使用足够强大的配置文件(admin / root)来承担任何用户配置文件的身份而无需密码。否则,通常获取用户配置文件令牌的唯一方法是为该配置文件提供合法的身份验证凭据。
要注意的一件事是确保更改线程的凭据,而不是整个流程。