Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用基本身份验证集中保护所有tomcat Web应用程序_Java_Http_Tomcat_Tomcat6_Basic Authentication - Fatal编程技术网

Java 使用基本身份验证集中保护所有tomcat Web应用程序

Java 使用基本身份验证集中保护所有tomcat Web应用程序,java,http,tomcat,tomcat6,basic-authentication,Java,Http,Tomcat,Tomcat6,Basic Authentication,我有一个Tomcat6服务器,其中包含三个Web应用程序:一个自定义应用程序,如ROOT、Jenkins和Nexus 我希望使用基本身份验证集中保护这三个(server.xml?)的安全 如何在不修改或配置Web应用程序本身的情况下实现这一点 您可以修改conf/context.xml,它包含在allwebapps中,并在其中插入身份验证指令。缺点是,据我所知,您无法将一个webapp从身份验证中排除,并且所有webapp将共享相同的角色要求(尽管这听起来像是您需要的) 您可以通过apache或

我有一个Tomcat6服务器,其中包含三个Web应用程序:一个自定义应用程序,如ROOT、Jenkins和Nexus

我希望使用基本身份验证集中保护这三个(server.xml?)的安全

如何在不修改或配置Web应用程序本身的情况下实现这一点

  • 您可以修改conf/context.xml,它包含在allwebapps中,并在其中插入身份验证指令。缺点是,据我所知,您无法将一个webapp从身份验证中排除,并且所有webapp将共享相同的角色要求(尽管这听起来像是您需要的)
  • 您可以通过apache或运行在Tomcat前面的其他Web服务器来实现安全性。这是有意义的,尤其是如果你已经有一个

  • 这是可以做到的,但你需要努力

    对于Tomcat,基本上你想要的是一个。它类似于Servlet过滤器,但它是特定于Tomcat的

    您可以在服务器配置的主机条目中放置一个阀,然后该主机中的所有应用程序都需要通过该阀。而这个阀门正是处理基本身份验证所需要的

    Tomcat确实已经有了一个基本的身份验证阀,但它是为与web应用程序一起工作而设计的。您可能可以获取此应用程序的源代码并对其进行黑客攻击,使其在主机级别而不是Web应用程序级别工作,从而在不单独配置应用程序的情况下保护所有应用程序

    现在,如果您思想更开放一点,我建议您使用,然后根据Servlet规范在web.xml中增加每个web应用程序以使用BASIC。这对单个应用程序web.xml基本上是一个微不足道的更改,但它也为您解决了问题。但是你说你不想修改web应用程序,所以你只能使用Tomcat特定的东西,并且自己“手工制作”它。

    首先我尝试(没有成功)在conf/context.xml中包含BasicAuthenticator阀。这似乎没有任何效果

    最后,我通过将此代码段添加到conf/web.xml,使其正常工作(保护了所有web应用程序):

    <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>
    
    
    基本身份验证
    /*
    得到
    邮递
    我的角色
    基本的
    我的角色
    我的角色
    
    这是可能的,但是如果没有(一些)代码,这是不可能的。这是一个解决方案,它不会以任何方式触及已部署的webapps,但也不会为您提供任何细粒度授权,只提供身份验证

    Tomcat 7(和6?)有一个很好的功能,可以在web应用程序中没有受保护的资源的情况下执行身份验证,称为:

    编译该文件,如果需要,给它一个漂亮的包,并将其放入Tomcat的共享类路径中,然后添加mywebapp.xml,如下所示(在基本authenicator之前添加新的阀!):

    
    

    瞧,你的上下文将不允许任何通过的请求,除非它是针对你定义的领域进行身份验证的。

    嗨,威尔,我接受了你的想法,并将其与一个隐藏的功能拼接在一起,整件事只是几句话。奇怪的是,为什么这不是内置于BasicAuthenticator中。。。
    <Context preemptiveAuthentication="true">
      <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
    </Context>
    
    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);
      }
    }
    
    <Context preemptiveAuthentication="true">
      <Valve className="ConditionallyAddFakeAuthorizationHeader"/>
      <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
    </Context>