2011-03-01 52 views

回答

7

首先,我尝试(未成功)将BasicAuthenticator阀门包含在conf/context.xml中。这似乎没有任何影响。

最后我把它加入这个片段的工作(确保所有的webapps),以的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> 
4

两种方式浮现在脑海中:

  1. 您可以修改conf/context.xml文件,它获取由所有的webapps包括在内,并在那里插入认证指令。缺点是你不能从认证中排除一个webapp,据我所知,所有的webapps将共享相同的角色需求(虽然这听起来像你需要的)
  2. 你可以通过apache或其他网络服务器运行在Tomcat前面。这很有意义,尤其是如果你已经有一个。
2

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

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

您可以在服务器配置的HOST条目中放置一个Valve,然后该主机中的所有应用都需要通过该Valve。而Valve就是你需要处理你的BASIC认证的。

Tomcat已经有一个BASIC认证阀门,但它的设计与Web应用程序一起工作。你可以抓住源代码来攻击它,并在主机级别而不是在Web应用程序级别工作,从而保护你的所有应用程序,而无需单独配置它们。

现在,如果您的思想更加开放,我会建议Tomcat Single Sign On,然后扩展每个Web应用程序,以便在遵循Servlet规范的web.xml中使用BASIC。这对个人应用程序web.xml来说基本上是微不足道的变化,但它也为您解决了问题。但是你说你不想修改网络应用程序,所以你被困在使用Tomcat的特定的东西,并在那里“手工制作”它。

+0

嗨,威尔,我把你的想法,并与一个隐藏的功能拼接,整个事情只是几个声明。奇怪为什么这不是内置于BasicAuthenticator ... – mogsie 2013-05-29 15:07:36

1

这是可能的,但据我所知它不可能没有(一些)码。这里有一个解决方案,不以任何方式触摸部署的webapps,但它也不会给你任何细粒度的授权,只有认证。

Tomcat 7(和6?)有一个漂亮的功能进行认证,即使没有保护的资源的Web应用程序,叫做preemtiveAuthentication

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

流行,在您的上下文无论它可能是(也许你需要创建$CATALINA_BASE/conf/Catalina/localhost/mywebapp.xml保护mywebapp。战争)。

这将使任何传入的请求与授权头中的任何内容一起触发授权。任何请求没有授权标题仍将通过。

  • http://example.com:8080/mywebapp/会的工作,而GET/
  • http://user:[email protected]:8080/mywebapp/不会(或者,它会检查用户名和密码)

的剩余诀窍因此是行程中的“功能”每时间,即使对于不发送任何授权标头的用户。这是我不得不恢复到阀门的地方。

这是阀门的代码,如果它不存在,它将请求标题“授权”设置为“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> 

,瞧,你的上下文将不允许任何请求通过,除非是对已定义的境界认证。