2011-09-26 21 views
7

(使用Java 6和Tomcat 6)充分利用HttpServletRequest.getRemoteUser()在Tomcat中的值,而無需修改應用程序

有沒有辦法讓我得到HttpServletRequest.getRemoteUser()在我的開發環境中返回一個值(即本地主機)而不需要修改我的應用程序的web.xml文件?

我問的原因是,應用程序部署到遠程環境時的身份驗證實現由Web服務器和插件工具處理。本地運行我顯然沒有插入工具或單獨的Web服務器;我只有Tomcat 6.我試圖避免將代碼添加到我的應用程序中,僅用於支持本地主機上的開發。

我希望有一個修改,我可以讓context.xml或server.xml文件,讓我設置遠程用戶ID或將嘗試從HTTP頭或其他東西拉它。

+0

你的web應用如何使用這個插件進行溝通? – palacsint

+1

@palacsint Web應用程序不與插件進行通信; Web服務器會照看它。 Web應用程序只是詢問遠程用戶的'HttpServletRequest'實例。 – Mark

回答

7

這裏是概念Valve實施的證明其做的:

import java.io.IOException; 
import java.security.Principal; 
import java.util.ArrayList; 
import java.util.List; 

import javax.servlet.ServletException; 

import org.apache.catalina.connector.Request; 
import org.apache.catalina.connector.Response; 
import org.apache.catalina.realm.GenericPrincipal; 
import org.apache.catalina.valves.ValveBase; 

public class RemoteUserValve extends ValveBase { 

    public RemoteUserValve() { 
    } 

    @Override 
    public void invoke(final Request request, final Response response) 
      throws IOException, ServletException { 
     final String username = "myUser"; 
     final String credentials = "credentials"; 
     final List<String> roles = new ArrayList<String>(); 

      // Tomcat 7 version 
     final Principal principal = new GenericPrincipal(username, 
          credentials, roles); 
      // Tomcat 6 version: 
      // final Principal principal = new GenericPrincipal(null, 
      //    username, credentials, roles); 


     request.setUserPrincipal(principal); 

     getNext().invoke(request, response); 
    } 

} 

(測試使用Tomcat 7.0.21)

編譯它,把它放在一個罐子內,罐子複製到apache-tomcat-7.0.21/lib文件夾。您需要修改server.xml

<Host name="localhost" appBase="webapps" 
    unpackWARs="true" autoDeploy="true"> 

    <Valve className="remoteuservalve.RemoteUserValve" /> 
... 

我想它的工作EngineContext容器裏面了。

的更多信息:

+0

感謝您的所有信息!我創建了一個像你描述的類,JAR了它並更新了'server.xml'文件。由於我運行的是Tomcat v6.0.20,因此我必須做出一個更改:'GenericPrincipal'簽名需要一個領域,所以我添加了'final Realm realm = request.getContext()。getRealm();'。但是,它似乎沒有效果。我也試過更新'context.xml'文件,但是它又沒有產生任何結果。當請求的主體和用戶ID到達我的應用程序代碼時,它們都是'null'。你有沒有做別的事? – Mark

+1

我剛剛通過'null'作爲領域,它適用於Tomcat 6.0.20。 (請參閱我在答案中的修改。)日誌中是否有任何異常? – palacsint

+1

非常感謝所有這些幫助。事實證明,我的閥門一直在正確實施。它沒有工作的原因是因爲我不明白在服務器啓動時設置'catalina.base' JVM屬性的重要性。一旦我在該位置修改了'server.xml',它就完美了。再次感謝! – Mark

1

使用本地的基於文件的領域進行測試。檢查您的conf/tomcat-users.xml併爲您的應用程序創建角色和用戶,並啓用web.xml中的安全約束。 tomcat-users.xml中有很好的例子。

+1

是的,我已經注意到了'tomcat-users.xml'文件,並知道在我的應用程序的web.xml中添加安全約束,但是我問是否有辦法實現類似的_without_修改實際/真實/目標 - for生產代碼;我會更快樂地修改我的本地服務器配置。 – Mark

+0

您好,palacsint您能否通過xml文件顯示部署遠程用戶的更多詳細信息...謝謝! – Edward

+0

@愛德華:對不起,我現在沒有時間完整答案。我想你應該問這是一個新問題。給我一個鏈接,如果沒有人回答,我會在週末檢查一下。 – palacsint

相關問題