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

Lal*_*tre 8 java iis gwt tomcat windows-authentication

我正在尝试使用Windows身份验证来处理使用GWT开发的第三方应用程序.我正在使用tomcat在Windows服务器上托管应用程序.我通过IIS代理访问该站点(安装在tomcat的文档之后).

如果我修改webapp的.jsp以显示"<%= request.getRemoteUser()%>",我会获得我正在跳转的用户名,我的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();
  }
}
Run Code Online (Sandbox Code Playgroud)

而且:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题可能与google的guice上的这个错误相关联:https://github.com/google/guice/issues/780

如果是这样,有什么工作吗?

Dan*_*den 0

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

如果 Guice bug 是罪魁祸首,那么很容易解决:只需确保在任何 Filter 验证请求并修改对象之后GuiceFilter安装它即可。HttpServletRequest

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