我的应用程序当前具有为特定 URL 定义的一种身份验证,带有自定义过滤器,通过从 URL(在查询字符串中)提取用户详细信息来对用户进行身份验证。这工作正常。现在我想使用身份证书为不同的 URL 模式添加新的身份验证(身份验证与第一个完全不同,它具有不同的用户详细信息服务等)。我看到 Spring Security 中已经支持 x509 证书身份验证。我想了解考虑以下几点我应该做的最佳配置是什么:
- 我希望用户访问不同的 URL 模式以通过相关身份验证进行身份验证,而不是先尝试一种身份验证,如果失败则尝试另一种身份验证。这就是为什么我认为我可能需要 2 个不同的身份验证管理器?
- 对于所有 URL,我的应用程序必须使用 HTTPS
- 我需要以仅对特定 URL 模式而不是所有应用程序需要客户端身份验证的方式配置 tomcat。
这是我迄今为止的第一次身份验证,任何帮助将不胜感激:
安全-applicationContext.xml:
<sec:http pattern="/urlAuth1" auto-config="false" entry-point-ref="url1EntryPoint">
<sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" requires-channel="https" />
<sec:custom-filter position="PRE_AUTH_FILTER" ref="urlPreAuthFilter"/>
</sec:http>
<bean id="urlPreAuthFilter" class="com.myapp.security.UrlPreAuthenticatedFilter">
<property name="authenticationManager" ref="authenticationManager" />
</bean>
<bean id="urlPreAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService" ref="urlUserDetailsService" />
</bean>
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider ref="urlPreAuthProvider" />
</sec:authentication-manager>
谢谢!
编辑 - 30.01.13:
我将以下部分添加到我的安全 context.xml 中。当我在访问两种 URL 模式时调试我的应用程序时,我看到对于第一个 URL 模式 (/urlAuth1),authenticationManager 中的 getProviders() 只返回一个提供程序,即 urlPreAuthProvider,而对于第二个 URL 模式 (/certAuthTest) 它返回两个提供者 - 我猜默认注册的匿名和预验证提供者。对我来说这没问题,因为这意味着每个模式都通过正确的提供者。我想确保我没有遗漏任何东西,你觉得这对吗?
<sec:http pattern="/certAuthTest" auto-config="false">
<sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" requires-channel="https" />
<sec:x509 subject-principal-regex="CN=(.*?)," user-service-ref="certUserDetailsService"/>
</sec:http>
关于 clientAuth 的 web.xml 配置,我会做更多的阅读,看看这是否有效。谢谢!