Apache,Client Certs,AJP Proxy,& Spring Security表达式

时间:2013-06-04 17:24:04

标签: apache tomcat spring-security client-certificates ajp

我已经配置了我的应用程序并让它在单一服务器环境中工作,Tomcat和Apache在同一系统上。现在,Apache被托管在一个单独的服务器上。据我所知,没有太大变化,但我的配置不再有效。在某些URL上,客户端证书为空,但以前不是这种情况。

从Apache我使用mod_ajp_proxy将api调用转发到我的Tomcat服务器:

<Location /api>
    SSLVerifyClient require
    ProxyPass ajp://192.168.x.x:8009/myapp
    ProxyPassReverse ajp://192.x.x.131:8009/cdpe
    ProxyPassReverseCookiePath /myapp /api
    ProxyPassReverseCookieDomain 192.168.x.x www.myapp.com
</Location>

该应用使用客户端证书身份验证。作为Spring Security过滤器链的一部分构建了一个自定义过滤器,它从请求中提取X509Certificate并登录用户。如果用户没有帐户,则会根据其证书信息创建帐户。所有这些都很有效,我们使用表达式来保护API。 Spring配置如下:

<http entry-point-ref="http403" use-expressions="true">
    <intercept-url pattern="/register/*" access="isAuthenticated()" />
    <intercept-url pattern="/**" access="hasRole('ROLE_user')" />
    <custom-filter position="PRE_AUTH_FILTER" ref="x509Filter" />
</http>

我们对新用户使用/ register API,我们使用isAuthenticated()表达式,因为新用户最初没有角色,但我们可以根据证书对它们进行身份验证。但是,在调用此方法时,HttpRequest对象中的x509Certificate显示为null。使用hasRole('ROLE_user')表达式的所有其他调用都可以看到证书。如果表达式更改为hasRole('ROLE_user'),则还会看到证书。我无法确定问题是Apache还是Spring Security相关,但是这确实在单个服务器配置上表现得很好,据我所知,没有其他配置差异。

0 个答案:

没有答案