spring security - 针对不同 CURL 模式的多重身份验证
Posted
技术标签:
【中文标题】spring security - 针对不同 CURL 模式的多重身份验证【英文标题】:spring security - mutiple authentications for differnt URL patterns 【发布时间】:2013-01-12 17:54:49 【问题描述】:我的应用程序目前为特定 URL 定义了一种身份验证,带有自定义过滤器,通过从 URL(在查询字符串中)提取用户详细信息来对用户进行身份验证。这工作正常。 现在我想使用身份证书为不同的 URL 模式添加新的身份验证(身份验证与第一个完全不同,它具有不同的用户详细信息服务等)。我看到 Spring Security 中已经支持 x509 证书身份验证。我想了解考虑以下几点我应该做的最佳配置是什么:
-
我希望用户访问不同的 URL 模式以通过相关身份验证进行身份验证,而不是先尝试一种身份验证,如果失败则尝试另一种身份验证。这就是为什么我认为我可能需要 2 个不同的身份验证管理器?
对于所有 URL,我的应用程序都必须使用 HTTPS
我需要将 tomcat 配置为只需要特定 URL 模式的客户端身份验证,而不是所有应用程序。
这是我迄今为止的第一次身份验证,任何帮助将不胜感激:
security-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>
谢谢!
编辑 - 13 年 1 月 30 日:
我将以下部分添加到我的安全 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 配置,我会做更多的阅读,看看这是否有效。谢谢!
【问题讨论】:
您可以通过添加另一个身份验证提供程序(而不是身份验证管理器)来解决该问题。详情请见***.com/questions/4783063/…。 Mapping each http block to a specific Authentication Provider的可能重复 【参考方案1】:您可以为所需的每个 URL 模式声明单独的身份验证管理器 bean,然后使用 <http />
元素上的 authentication-manager-ref
属性将它们分配给各个过滤器链。
<http pattern="/someapi/**" authentication-manager-ref="someapiAuthMgr">
...
</http>
您可以将标准 ProviderManager
bean 用于各个身份验证管理器。
要对所有请求强制使用 HTTPS,您可以使用standard web.xml settings。
客户端证书身份验证在 SSL 连接建立时进行。所以你要么拥有它,要么你没有。调查clientAuth
tomcat 连接器设置。您可以将其设置为“想要”以请求客户端证书,但不需要 SSL 连接才能成功。
【讨论】:
感谢您的回答。如果您可以看一下,我添加了对原始问题的更新。 作为 bean 簿记的一部分,<http />
元素注册了一个内部身份验证管理器,该管理器委托给“父级”管理器(您定义的外部管理器)。这就是您看到的身份验证提供程序的来源。
但是为什么对于第一个 http 身份验证,只找到一个提供程序(我在 xml 中定义的 urlPreAuthProvider),而对于另一个 http 身份验证,我有不同的提供程序,我没有定义在哪里?
这偏离了原始问题,但如果您真的想了解命名空间如何工作的血腥细节,可以查看源代码。您可以查看ProviderManager
以了解身份验证管理器如何仅在需要时调用其“父级”。这可能就是您所看到的。以上是关于spring security - 针对不同 CURL 模式的多重身份验证的主要内容,如果未能解决你的问题,请参考以下文章
针对授权标头的Spring Security OAuth2 CORS问题
如何在单元测试中针对 Spring Security 对用户进行身份验证
如何通过 XML 配置仅针对特定 URL 模式在 Spring Security 4 中禁用 CSRF?
Spring Security - 在Spring Boot中针对LDAP使用Active Directory对用户进行身份验证