在Tomcat上使用CORS进行摘要式身份验证

时间:2015-11-01 17:06:21

标签: tomcat cors servlet-filters digest-authentication security-constraint

现在我正在构建一个运行在Tomcat 8上的rest api,它使用Apache的CorsFilter来允许我在web.xml中设置的跨域请求:

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/webapi/*</url-pattern>
</filter-mapping>

到目前为止,我现在很容易在我的Rest-API中添加DIGEST身份验证,是非基本的消化!

对于简单的用法,我想在web.xml上使用security-constraints:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>all</web-resource-name>
        <url-pattern>/webapi/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>DIGEST</auth-method>
    <realm-name>UserDatabase</realm-name>
</login-config>

身份验证和CORS过滤器在那里工作正常,但这里启动问题: 安全约束由CORS过滤器之前的servlet容器执行。 因此,身份验证算法不会在摘要式身份验证标头中设置所需的CORS(跨域请求标头),因此CORS请求将在身份验证时失败,因为摘要401页面带有“challange”(nonce,qop,领域等)缺少跨域请求的必要标头。 现在有人为该问题提供解决方案或实施吗?或者我真的需要实现我自己的摘要过滤器,因为CORS?!

1 个答案:

答案 0 :(得分:0)

您可以尝试将CorsFilter重新实现为Tomcat valve,并确保将其配置为在Digest Authenticator Valve之前运行。