为啥 request.getRemoteUser() 有时会返回 tomcat windows 服务帐户

Posted

技术标签:

【中文标题】为啥 request.getRemoteUser() 有时会返回 tomcat windows 服务帐户【英文标题】:Why is request.getRemoteUser() returning the tomcat windows service account sometimes为什么 request.getRemoteUser() 有时会返回 tomcat windows 服务帐户 【发布时间】:2016-12-03 07:27:37 【问题描述】:

我正在尝试让 Windows 身份验证与使用 GWT 开发的第 3 方应用程序一起工作。 我在 Windows 服务器上使用 tomcat 托管应用程序。我通过 IIS 代理(按照 tomcat 的文档安装)访问该站点。

如果我修改 webapp 的 .jsp 以显示 "" ,我会得到我想要的用户名,我的 windows 帐户。

但是 webapp 使用我在服务器上安装 Tomcat Windows 服务的帐户对我进行身份验证。

在 webapp 的(反编译的)源代码中,我看到对完全相同的 "request.getRemoteUser()" 的调用,所以我想知道哪里有区别。

这里是反编译的类:

import javax.servlet.http.HttpServletRequest;

public class RemoteUserLoginProvider
  extends BaseRequestLoginProvider

  public String extractLoginFromRequest(HttpServletRequest request)
  
    return request.getRemoteUser();
  

还有:

import com.google.inject.Inject;
import com.google.inject.Provider; 
import javax.servlet.http.HttpServletRequest;

public abstract class BaseRequestLoginProvider
  implements Provider<String>

  @Inject
  private Provider<HttpServletRequest> requestProvider;

  public abstract String extractLoginFromRequest(HttpServletRequest paramHttpServletRequest);

  public String get()
  
    HttpServletRequest request = (HttpServletRequest)this.requestProvider.get();
    String userlogin = extractLoginFromRequest(request);

    return userlogin;
  

我的问题是否与谷歌 guice 上的这个错误有关:https://github.com/google/guice/issues/780?

如果是这样,有什么解决方法吗?

【问题讨论】:

我在这里改写了我的问题:***.com/questions/38664679/…,经过额外测试以排除问题出在 guice/gwt 的可能性。 【参考方案1】:

request.getRemoteUser()返回的用户名是在用户名映射到Windows account之前客户端发送的授权头中派生的。如果您的 Web 服务器上安装了将传入用户映射到帐户的身份验证过滤器,请使用 LOGON_USER 查看映射的用户名。

IIS server variables

【讨论】:

如果上述解决方案对您没有帮助,您也可以阅读本文。 blogs.oracle.com/wssfc/…【参考方案2】:

HttpServletRequest.getRemoteUser() 通常只返回与 CGI REMOTE_USER 变量相同的值,这是来自 HTTP 基本身份验证的用户名。听起来您希望它是一个不同的值,这意味着正在修改 HttpServletRequest 对象。这很可能是由 Servlet 过滤器完成的。

如果 Guice 错误是罪魁祸首,那么解决方法很容易:只需确保在过滤器验证请求和修改 HttpServletRequest 对象之后安装GuiceFilter p>

作为一般经验法则,我不认为像这样修改请求是一个好主意,正是因为当出现问题时很难调试。相反,如果您有一个 @RequestScoped 提供程序,它从请求中提取了您想要的值并进行了您需要的任何身份验证,那么您可以通过依赖注入来使用用户信息。或者,更一般地说:总是更喜欢创建新的(最好是不可变的)值,而不是改变现有的对象——这使得控制流更容易推理。

【讨论】:

以上是关于为啥 request.getRemoteUser() 有时会返回 tomcat windows 服务帐户的主要内容,如果未能解决你的问题,请参考以下文章

急急急!谁能给我解释下String IPs=request.getRemoteAddr();啥意思啊

你应该同步运行方法吗?为啥或者为啥不?

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?