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

时间:2016-07-28 18:34:39

标签: java tomcat iis gwt 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();
  }
}

并且:

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;
  }
}

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

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

2 个答案:

答案 0 :(得分:0)

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

如果Guice错误是罪魁祸首,那么解决这个问题就很容易了:只需确保在之后安装了GuiceFilter过滤器对请求进行身份验证并修改HttpServletRequest对象

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

答案 1 :(得分:0)

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

IIS server variables