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