Java Spring安全性-多个身份验证提供程序

Java Spring安全性-多个身份验证提供程序,java,spring,authentication,spring-security,Java,Spring,Authentication,Spring Security,我的web应用程序有多个身份验证管理器(一个用于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:

我的web应用程序有多个身份验证管理器(一个用于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配置:)



请记住,这个Spring安全XML名称空间只是组织XML的一种简洁方式。您可以使用纯
配置实现完全相同的解决方案。这样你就可以像往常一样使用ID了。可能会对您有所帮助。

在命名空间中,可以使用带有名称的
@服务(“userDetailsService”)
将名称添加到
java

您还可以定义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>

[...]
\u authenticationManager
是在命名空间中注册的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>