我的网络应用程序有多个身份验证管理器(一个用于API访问一个API)。 api应该只有一个基本的auth服务 - 通过弹簧安全标记配置,如下所示:
<?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>
答案 0 :(得分:4)
请记住,这个Spring Security XML命名空间只是组织XML的一种巧妙方式。您可以使用普通<bean>
配置实现完全相同的解决方案。这样你就可以像往常一样使用ID。 This blog post可能对您有所帮助。
答案 1 :(得分:0)
在名称空间中,名称可以在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的名称。
这将在基本身份验证之前执行。