所有级别的身份验证都使用X509进行Spring Security

时间:2016-08-23 20:48:19

标签: spring tomcat spring-security x509

我有一个遗留应用程序,我将从用户密码转换为使用基于证书的身份验证。我正在使用Tomcat 7,我的应用程序需要支持基于用户尝试访问的应用程序中的URL的4种类型的安全性

例如: 一些servlet将使用HTTP 一些servlet将使用HTTPS而无需任何身份验证 一些servlet将使用PKI进行相互身份验证,但事先不会知道用户,因此任何在证书链中具有有效证书的用户都将被授予访问权限。 应用程序的重置是管理,因此它将基于预定义的用户证书CN进行基于角色的访问。

我有一个连接器在443运行HTTPS,clientAuth ="想要"在我的Tomcat server.xml

我的应用程序web.xml有一个springSecurityFilterChain,它列出了我想要HTTPS的任何URL

我的springSecurityContext.xml有一个x509部分,其subject-principal-regex =" CN =(。*?),"用户服务-REF ="的UserDetailsS​​ervice"它从属性文件中读取预先注册的用户和角色。从那里,我列出了拦截网址模式,我希望有一个require-channel =" https"什么模式需要哪些角色。

我还通过设置access =" IS_AUTHENTICATED_ANONYMOUSLY"添加了我希望它只需要HTTPS的URL。作为拦截网址

这让我得到了我需要的4个要求中的3个,因为上面的任何URL都会使用spring安全性自动从HTTP重定向到HTTPS,并根据角色强制执行用户凭据,或者根本不检查客户端证书。未放入web.xml的url-pattern springSecurityFilterChain将接受HTTP连接。

我无法弄清楚的是最终模式,即应用程序要求提供客户端证书,该证书将针对证书链中的CA进行验证,但不会针对我已知的用户数据库进行验证。角色。他们将拥有有效的证书,我需要访问客户端证书才能发现,但实际上我的系统中并不知道,因为他们只是应用程序的普通用户。我不太清楚如何做到这一点。

以下是我的3个XML文件中的一些片段,以显示我在说什么。我只在springSecurity中包含了httpsandcertlink,以显示我想添加哪一个,但无法开始工作。

server.xml中

<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme"https" secure="true"
clientAuth="want" sslProtocol"TLS"
keystoreFile="doesntmatter"
truststoreFile="doesntmatter" />

的web.xml

<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>MYAPP</realm-name>
</login-config>

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>*.go</url-pattern>
<url-pattern>/httpsonlylink</url-pattern>
<url-pattern>/httpsandcertlink</url-pattern>
</filter-mapping>

springSecurityContext.xml

<security:http xmlns="http://www.springframework.org/schema/security" >
<security:x509 subject-principal-regex="CN=(.*?)," user-service-ref="userDetailsService" />
<security:intercept-url pattern="/management**" requires-channel="https" access="ROLE_MGMT" />
<security:intercept-url pattern="/httpsonlylink**" requires-channel="https" access="IS_AUTHENTICAED_ANONYMOUSLY" />
<security:intercept-url pattern="/httpsandcertlink**" requires-channel="https" --not sure what to change here-- />
</security:http>

<security:authentication-manager xmlns="http://www.springframework.org/schema/security" alias="authenticationManager">
<security:authentication-provider>
<security:user-service id="userDetailsService" properties="\WEB-INF\users.properties" />
</security:authentication-provider>
</security:authentication-manager>

1 个答案:

答案 0 :(得分:0)

一种方法是通过创建一个自动分配所有用户的附加“有效证书”角色来搭载对角色要求的缺失要求。应该已经需要一个有效的证书链,所以应该要求的是设置一个intercept-url模式,该模式可以匹配任何需要有效证书并需要“有效证书”角色的URL,确保此规则匹配< em>在需要特定角色的人之后。