Spring Security - 多个身份验证提供程序

Posted

技术标签:

【中文标题】Spring Security - 多个身份验证提供程序【英文标题】:Spring Security - multiple authentication-providers 【发布时间】:2012-02-18 11:25:31 【问题描述】:

我的网络应用有多个身份验证管理器(一个用于 API,一个用于 WEB 访问)。 api 应该只有一个基本的身份验证服务 - 通过 spring 安全标记配置,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <security:authentication-manager alias="apiAuthenticationManager">
        <security:authentication-provider ref="apiAuthenticationProvider" />
    </security:authentication-manager>

    <security:authentication-provider >
        <security:user-service>
            <security:user name="apiadmin" password="password" authorities="ROLE_API_ADMIN" />
            <security:user name="apiuser" password="otherpassword" authorities="ROLE_API_USER" />
        </security:user-service>
    </security:authentication-provider>
...

我不能内联身份验证提供程序,因为我希望它可以被子 bean 配置覆盖。

我的问题是我无法在 security:authentication-provider 元素上定义别名/ID 以在身份验证管理器中引用它。有没有简单的解决方法?

解决方案:

我终于想出了如何使用命名空间方式来做到这一点,而无需深入研究普通的 bean 配置:)

<security:user-service id="apiUserDetailsService"> 
    <security:user name="apiadmin" password="password" authorities="ROLE_API_ADMIN" />
    <security:user name="apiuser" password="otherpassword" authorities="ROLE_API_USER" />
    </security:user-service>

<security:authentication-manager alias="apiAuthenticationManager">
    <security:authentication-provider user-service-ref="apiUserDetailsService"/>
</security:authentication-manager>

【问题讨论】:

【参考方案1】:

请记住,这个 Spring Security XML 命名空间只是组织 XML 的一种巧妙方式。您可以使用普通的 &lt;bean&gt; 配置实现完全相同的解决方案。这样您就可以像往常一样使用 ID。 This blog post 可能对你有帮助。

【讨论】:

【参考方案2】:

在命名空间中名称可以在java加上@Service("userDetailsService")加上名称。

您还可以定义 bean 并将它们添加到链中。

<bean id="myFilter" class="a.b.c.myFilter">
    <security:custom-filter before="BASIC_PROCESSING_FILTER" />
    <property name="authenticationManager" ref="_authenticationManager" />
</bean>
<bean id="myProvider" class="a.b.c.myProvider">
    <security:custom-authentication-provider />
    <property name="userDetailsService" ref="userDetailsService" />
</bean>

<security:http>
    [...]
</security:http>

_authenticationManager 是在命名空间中注册的 bean 的名称。

这将在基本身份验证之前执行。

【讨论】:

以上是关于Spring Security - 多个身份验证提供程序的主要内容,如果未能解决你的问题,请参考以下文章

特定 url 的多个身份验证提供程序 - Spring Boot Security

Spring Security:针对多个 LDAP 服务器和基于 DAO 的身份验证进行身份验证

防止 Spring Security 通过下一个身份验证提供程序对具有 BadCredentialException 的用户进行身份验证

Spring security OAuth中的多个资源服务器配置

Spring-Security:优化获取当前经过身份验证的用户...

Spring Security 中的基本身份验证(身份验证失败消息)