簡體   English   中英

使用BASIC身份驗證集中保護所有tomcat webapps

[英]Centrally secure all tomcat webapps using BASIC authentication

我有一個包含三個webapps的Tomcat 6服務器:一個自定義的ROOT,Jenkins和Nexus。

我想使用BASIC身份驗證來集中保護所有三個(server.xml?)。

如何在修改或配置Web應用程序的情況下實現此目的?

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

最后,我通過將此片段添加到conf / web.xml來使其工作(保護所有webapps):

<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>

想到兩種方式:

  1. 您可以修改conf / context.xml,它將包含在所有 Web應用程序中,並在其中插入身份驗證指令。 缺點是,據我所知,您無法從身份驗證中排除一個Web應用程序,並且所有Web應用程序將共享相同的角色要求(盡管這聽起來像您需要的)
  2. 您可以通過apache或在Tomcat前運行的其他一些Web服務器來實現安全性。 這是有道理的,特別是如果你已經有一個。

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

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

您可以將Valve放在服務器配置的HOST條目中,然后該主機中的所有應用程序都需要通過該Valve。 而Valve是您處理BASIC身份驗證所需的。

Tomcat已經擁有BASIC身份驗證閥,但它的設計目的是與Web應用程序配合使用。 您可以抓住源代碼並將其破解為在主機級而不是Web App級別工作,從而保護所有應用程序而無需單獨配置它們。

現在,如果你有點開放,我建議使用Tomcat Single Sign On ,然后根據Servlet規范擴充每個Web應用程序以在其web.xml中使用BASIC。 這對於單個應用程序web.xml來說是一個基本上微不足道的變化,但它也為您解決了這個問題。 但是你說你不想修改網絡應用程序,所以你不得不使用Tomcat特定的東西,並自己“手工制作”它。

這是可能的,但AFAIK沒有(某些)代碼是不可能的。 這是一個解決方案,它不會以任何方式觸及已部署的Web應用程序 ,但它也不會為您提供任何細粒度的授權,只提供身份驗證。

Tomcat 7(和6?)有一個很好的功能來執行身份驗證,即使Web應用程序中沒有受保護的資源,稱為preemtiveAuthentication

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

在你的上下文中彈出它可能是什么(也許你需要創建$CATALINA_BASE/conf/Catalina/localhost/mywebapp.xml來保護mywebapp.war)。

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

  • http://example.com:8080/mywebapp/將工作,而GET /
  • http://user:password@example.com:8080/mywebapp/不會(或者,它會檢查用戶名和密碼)

因此,剩下的技巧是每次都會觸發“功能”,即使對於不發送任何授權標頭的用戶也是如此。 這是我必須恢復閥門的地方。

以下是閥門的代碼,如果不存在,則將請求標頭“Authorization”設置為“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>

並且,除非對您定義的領域進行身份驗證,否則您的上下文將不允許任何請求通過

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM