我正在尝试使用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?
如果是这样,有什么工作吗?
答案 0 :(得分:0)
HttpServletRequest.getRemoteUser()
通常只返回与CGI REMOTE_USER
变量相同的值,该变量是来自HTTP基本身份验证的用户名。听起来你希望它是一个不同的值,这意味着某些东西正在修改HttpServletRequest
对象。很可能这是通过Servlet过滤器完成的。
如果Guice错误是罪魁祸首,那么解决这个问题就很容易了:只需确保在之后安装了GuiceFilter
过滤器对请求进行身份验证并修改HttpServletRequest
对象
作为一般的经验法则,我不认为修改这样的请求是个好主意,正是因为当出现问题时调试很难。相反,如果您有一个@RequestScoped
提供程序从请求中提取您想要的值并执行您需要的任何身份验证,则可以通过依赖注入来使用用户信息。或者,更一般地说:总是喜欢创建新的(最好是不可变的)值而不是改变现有的对象 - 它使得控制流更容易推理。
答案 1 :(得分:0)
request.getRemoteUser()
返回用户名,该用户名是从用户名映射到Windows account
之前由客户端发送的授权标头派生的。如果您在Web服务器上安装了将传入用户映射到帐户的身份验证筛选器,请使用LOGON_USER
查看映射的用户名。