我的应用程序当前有一个为特定URL定义的身份验证,带有自定义过滤器,用户通过从URL(在查询字符串中)提取用户详细信息进行身份验证。这工作正常。 现在,我想使用身份证书为不同的URL模式添加新的身份验证(身份验证与第一个完全不同,它具有不同的用户详细信息服务等)。我看到在spring security中已经支持x509 cert认证了。我想了解考虑以下内容时应该做的最佳配置:
这是我到目前为止第一次认证的内容,任何帮助都将不胜感激:
安全的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配置,我会做更多阅读,看看是否有效。谢谢!
答案 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连接成功。