Java 使用基本身份验证集中保护所有tomcat Web应用程序
我有一个Tomcat6服务器,其中包含三个Web应用程序:一个自定义应用程序,如ROOT、Jenkins和Nexus 我希望使用基本身份验证集中保护这三个(server.xml?)的安全 如何在不修改或配置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或
这是可以做到的,但你需要努力 对于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>