为啥 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?为啥不直接更改渲染坐标?