我有一个包含三个webapps的Tomcat 6服务器:一个自定义的服务器,如ROOT,Jenkins和Nexus。
我想使用BASIC身份验证来集中保护所有三个(server.xml?)。
如何在没有修改或配置网络应用程序的情况下实现
答案 0 :(得分:7)
首先,我尝试(未成功)在 conf / context.xml 中包含BasicAuthenticator阀门。这似乎没有任何影响。
最后,我通过将此代码段添加到 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>
答案 1 :(得分:5)
有两种想法:
答案 2 :(得分:2)
可以做到,但你需要继续努力。
对于Tomcat,基本上你想要的是Tomcat Valve。它就像一个Servlet过滤器,但它是特定于Tomcat的。
您可以将Valve放置在服务器配置的HOST条目中,然后该主机中的所有应用程序都需要通过该Valve。而Valve是您处理BASIC身份验证所需的。
Tomcat已经拥有BASIC身份验证阀,但它可以与Web应用程序配合使用。您可以抓住源代码并将其破解为在主机级而不是Web应用程序级别工作,从而保护您的所有应用程序而无需单独配置它们。
现在,如果您有点开放,我会建议Tomcat Single Sign On,然后根据Servlet规范扩充每个Web应用程序以在其web.xml中使用BASIC。这对于单个应用程序web.xml来说是一个基本上微不足道的变化,但它也为您解决了这个问题。但是你说你不想修改网络应用程序,所以你不得不使用Tomcat特定的东西,并自己“手工制作”它。
答案 3 :(得分:1)
这是可能的,但如果没有(某些)代码,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标头中的任何内容一起触发授权。任何没有授权标头的请求仍然可以通过。
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>
瞧,您的上下文不允许通过发出任何请求,除非它已针对您定义的领域进行了身份验证。