没有定义[org.springframework.security.web.savedrequest.RequestCache]类型的限定bean

时间:2013-01-25 20:07:37

标签: spring spring-security

我的spring安全配置中有多个http块。从Spring Security 3.1版开始就允许这样做。当我的SpringSocial配置尝试自动注入RequestCache对象时,会发生此问题。我收到以下错误:没有定义[org.springframework.security.web.savedrequest.RequestCache]类型的限定bean:期望的单个匹配bean但找到3.如果我将Java代码中的引用删除到自动连接的RequestCache对象,在我的xml配置中有三个http块是可以的。修复此错误的最佳方法是什么?有没有办法自动装配正确的RequestCache?

xml http阻止:

<http pattern="/oauth/token"...>
</http>

<http pattern="/something/**...>
</http>

<http use-expressions="true"...>
</http>

在Java Config中,引用了一个自动连接的RequestCache:

@Bean
public ProviderSignInController providerSignInController(RequestCache requestCache) {
    return new ProviderSignInController(connectionFactoryLocator(), usersConnectionRepository(), new SimpleSignInAdapter(requestCache, userService));
} 

这些都不会导致问题。但是,拥有多个http块和一个自动装配的RequestCache会导致:“没有定义类型[org.springframework.security.web.savedrequest.RequestCache]的限定bean:预期的单个匹配bean但找到3”

有人能帮助我正确配置吗?

1 个答案:

答案 0 :(得分:6)

问题是每个块都创建自己的RequestCache实例。由于RequestCache的默认实现使用相同的数据存储(即HttpSession),因此使用新实例仍将在块之间工作。但是,当您尝试使用自动装配时,它不知道要使用哪个实例。相反,您创建自己的HttpSessionRequestCache实例并使用它(就像http块一样)。例如:

@Bean
public ProviderSignInController providerSignInController() {
    RequestCache requestCache = new HttpSessionRequestCache();  
    return new ProviderSignInController(connectionFactoryLocator(), usersConnectionRepository(), new SimpleSignInAdapter(requestCache, userService));
}

应该起作用的替代方法是在配置中指定RequestCache并使用request-cache element重用相同的实例。例如:

<bean:bean class="org.springframework.security.web.savedrequest.HttpSessionRequestCache"
        id="requestCache" />

<http pattern="/oauth/token"...>
    <request-cache ref="requestCache"/>
</http>

<http pattern="/something/**...>
    <request-cache ref="requestCache"/>
</http>

<http use-expressions="true"...>
    <request-cache ref="requestCache"/>
</http>

由于只有一个RequestCache实例,您可以使用现有的Java Config(即自动装配RequestCache)。请注意,如果需要,您可以轻松地在Java Config中创建RequestCache而不是XML。