我已经配置了我的应用程序并让它在单一服务器环境中工作,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相关,但是这确实在单个服务器配置上表现得很好,据我所知,没有其他配置差异。