2

我的应用程序当前具有为特定 URL 定义的一种身份验证,带有自定义过滤器,通过从 URL(在查询字符串中)提取用户详细信息来对用户进行身份验证。这工作正常。现在我想使用身份证书为不同的 URL 模式添加新的身份验证(身份验证与第一个完全不同,它具有不同的用户详细信息服务等)。我看到 Spring Security 中已经支持 x509 证书身份验证。我想了解考虑以下几点我应该做的最佳配置是什么:

  1. 我希望用户访问不同的 URL 模式以通过相关身份验证进行身份验证,而不是先尝试一种身份验证,如果失败则尝试另一种身份验证。这就是为什么我认为我可能需要 2 个不同的身份验证管理器?
  2. 对于所有 URL,我的应用程序必须使用 HTTPS
  3. 我需要以仅对特定 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 配置,我会做更多的阅读,看看这是否有效。谢谢!

4

1 回答 1

3

您可以为所需的每个 URL 模式声明单独的身份验证管理器 bean,然后使用元素authentication-manager-ref上的属性将它们分配给各个过滤器链<http />

<http pattern="/someapi/**"  authentication-manager-ref="someapiAuthMgr">
    ...
</http>

您可以将标准ProviderManagerbean 用于各个身份验证管理器。

要对所有请求强制实施 HTTPS,您可以使用标准 web.xml 设置

客户端证书身份验证在 SSL 连接建立时进行。所以你要么拥有它,要么你没有。调查clientAuthtomcat 连接器设置。您可以将其设置为“想要”以请求客户端证书,但不需要 SSL 连接才能成功。

于 2013-01-29T18:25:58.053 回答