2016-07-28 74 views
8

我试图让Windows验证与使用GWT开发的第三方应用程序一起工作。 我在tom服务器上托管应用程序。我通过IIS代理访问站点(在tomcat的文档之后安装)。为什么request.getRemoteUser()返回tomcat windows服务帐户有时

如果我修改了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; 
    } 
} 

难道我的问题被链接到这个bug谷歌的吉斯:https://github.com/google/guice/issues/780

如果是这样,是否有任何解决办法?

+0

我在这里重新表述了我的问题:http://stackoverflow.com/questions/38664679/request-getremoteuser-returns-a-different-login-in-jsp-than-in-a-servlet-filt,经过附加测试排除问题出现在guice/gwt的可能性。 – Laloutre

回答

0

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

如果吉斯错误是罪魁祸首,它很容易解决:只需确保GuiceFilter安装任何过滤器进行身份验证请求,并修改HttpServletRequest对象。

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

相关问题