spring security - 针对不同URL模式的多重身份验证

时间:2013-01-29 08:04:11

标签: spring-security authentication

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

  1. 我希望用户访问不同的URL模式,通过相关的身份验证进行身份验证,而不是首先尝试使用一次身份验证,如果失败则尝试另一次。这就是为什么我认为我可能需要2个不同的身份验证管理器?
  2. 我的应用必须使用HTTPS进行所有网址
  3. 我需要以一种只需要特定URL模式而不是所有应用程序的客户端身份验证的方式配置tomcat。
  4. 这是我到目前为止第一次认证的内容,任何帮助都将不胜感激:

    安全的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),它返回两个提供者 - 匿名和preauthenticated提供者,我猜是默认注册。对我来说这没关系,因为它意味着每个模式都通过正确的提供者。我想确保我没有遗漏任何东西,这对你来说是否合适?

    <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配置,我会做更多阅读,看看是否有效。谢谢!     

1 个答案:

答案 0 :(得分:3)

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

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

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

要为所有请求强制执行HTTPS,您可以使用standard web.xml settings

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