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,然后使用 &lt;http /&gt; 元素上的 authentication-manager-ref 属性将它们分配给各个过滤器链。

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

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

要对所有请求强制使用 HTTPS,您可以使用standard web.xml settings。

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

【讨论】:

感谢您的回答。如果您可以看一下,我添加了对原始问题的更新。 作为 bean 簿记的一部分,&lt;http /&gt; 元素注册了一个内部身份验证管理器,该管理器委托给“父级”管理器(您定义的外部管理器)。这就是您看到的身份验证提供程序的来源。 但是为什么对于第一个 http 身份验证,只找到一个提供程序(我在 xml 中定义的 urlPreAuthProvider),而对于另一个 http 身份验证,我有不同的提供程序,我没有定义在哪里? 这偏离了原始问题,但如果您真的想了解命名空间如何工作的血腥细节,可以查看源代码。您可以查看ProviderManager 以了解身份验证管理器如何仅在需要时调用其“父级”。这可能就是您所看到的。

以上是关于spring security - 针对不同 CURL 模式的多重身份验证的主要内容,如果未能解决你的问题,请参考以下文章

针对授权标头的Spring Security OAuth2 CORS问题

Spring Security 可以支持多个入口点吗?

如何在单元测试中针对 Spring Security 对用户进行身份验证

如何通过 XML 配置仅针对特定 URL 模式在 Spring Security 4 中禁用 CSRF?

列出来自 Spring Security 的用户

Spring Security - 在Spring Boot中针对LDAP使用Active Directory对用户进行身份验证