2011-03-01 35 views

回答

7

首先,我嘗試(未成功)將BasicAuthenticator閥門包含在conf/context.xml中。這似乎沒有任何影響。

最後我把它加入這個片段的工作(確保所有的webapps),以的conf/web.xml中

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Basic Authentication</web-resource-name> 
<!--Here wildcard entry defines authentication is needed for whole app --> 
      <url-pattern>/*</url-pattern> 
     <http-method>GET</http-method> 
     <http-method>POST</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>myrole</role-name> 
    </auth-constraint> 
</security-constraint> 

<login-config> 
    <auth-method>BASIC</auth-method> 
</login-config> 

<security-role> 
    <description>My role</description> 
    <role-name>myrole</role-name> 
</security-role> 
4

兩種方式浮現在腦海中:

  1. 您可以修改conf/context.xml文件,它獲取由所有的webapps包括在內,並在那裏插入認證指令。缺點是你不能從認證中排除一個webapp,據我所知,所有的webapps將共享相同的角色需求(雖然這聽起來像你需要的)
  2. 你可以通過apache或其他網絡服務器運行在Tomcat前面。這很有意義,尤其是如果你已經有一個。
2

它可以完成,但你需要努力。

對於Tomcat,基本上你想要的是一個Tomcat Valve。它就像一個Servlet過濾器,但它是特定於Tomcat的。

您可以在服務器配置的HOST條目中放置一個Valve,然後該主機中的所有應用都需要通過該Valve。而Valve就是你需要處理你的BASIC認證的。

Tomcat已經有一個BASIC認證閥門,但它的設計與Web應用程序一起工作。你可以抓住源代碼來攻擊它,並在主機級別而不是在Web應用程序級別工作,從而保護你的所有應用程序,而無需單獨配置它們。

現在,如果您的思想更加開放,我會建議Tomcat Single Sign On,然後擴展每個Web應用程序,以便在遵循Servlet規範的web.xml中使用BASIC。這對個人應用程序web.xml來說基本上是微不足道的變化,但它也爲您解決了問題。但是你說你不想修改網絡應用程序,所以你被困在使用Tomcat的特定的東西,並在那裏「手工製作」它。

+0

嗨,威爾,我把你的想法,並與一個隱藏的功能拼接,整個事情只是幾個聲明。奇怪爲什麼這不是內置於BasicAuthenticator ... – mogsie 2013-05-29 15:07:36

1

這是可能的,但據我所知它不可能沒有(一些)碼。這裏有一個解決方案,不以任何方式觸摸部署的webapps,但它也不會給你任何細粒度的授權,只有認證。

Tomcat 7(和6?)有一個漂亮的功能進行認證,即使沒有保護的資源的Web應用程序,叫做preemtiveAuthentication

<Context preemptiveAuthentication="true"> 
    <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" /> 
</Context> 

流行,在您的上下文無論它可能是(也許你需要創建$CATALINA_BASE/conf/Catalina/localhost/mywebapp.xml保護mywebapp。戰爭)。

這將使任何傳入的請求與授權頭中的任何內容一起觸發授權。任何請求沒有授權標題仍將通過。

  • http://example.com:8080/mywebapp/會的工作,而GET/
  • http://user:[email protected]:8080/mywebapp/不會(或者,它會檢查用戶名和密碼)

的剩餘訣竅因此是行程中的「功能」每時間,即使對於不發送任何授權標頭的用戶。這是我不得不恢復到閥門的地方。

這是閥門的代碼,如果它不存在,它將請求標題「授權」設置爲「foo」。

import javax.servlet.ServletException; 
import java.io.IOException; 
import org.apache.catalina.valves.ValveBase; 
import org.apache.catalina.connector.Request; 
import org.apache.catalina.connector.Response; 

public class ConditionallyAddFakeAuthorizationHeader extends ValveBase { 
    public void invoke(Request request, Response response) throws IOException, ServletException { 
    if (request.getCoyoteRequest().getMimeHeaders().getValue("authorization") == null) { 
     request.getCoyoteRequest().getMimeHeaders().addValue("authorization").setString("foo"); 
    } 
    getNext().invoke(request, response); 
    } 
} 

編譯文件,給它一個很好的包,如果你想,把它放在Tomcat的共享類路徑,並添加更改mywebapp.xml如下(基本authenicator之前添加新的閥門!):

<Context preemptiveAuthentication="true"> 
    <Valve className="ConditionallyAddFakeAuthorizationHeader"/> 
    <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" /> 
</Context> 

,瞧,你的上下文將不允許任何請求通過,除非是對已定義的境界認證。