Reputation: 5647
I am implementing Remember me in spring security.And here is my configuration
<bean id="rememberMeServices"
class="com.spring.security.service.WMPersistentTokenBasedRememberMeServices">
<constructor-arg name="userDetailsService" ref="loginService"/>
<property name="tokenValiditySeconds" value="300"></property>
</bean>
<security:http auto-config="false" use-expressions="true" entry-point-ref="appAuthenticationEntryPoint">
<!-- Interceptor urls -->
<security:remember-me user-service-ref="#{rememberMeServices.getUserDetailsServiceInstance()}" token-repository-ref="#{rememberMeServices.getTokenRepository()}" />
</security:http>
And my WMPersistentTokenBasedRememberMeServices looks like
public class WMPersistentTokenBasedRememberMeServices extends PersistentTokenBasedRememberMeServices {
private static final String key = "WM_APP_KEY";
private static final PersistentTokenRepository tokenRepository = new InMemoryTokenRepositoryImpl();
public WMPersistentTokenBasedRememberMeServices(UserDetailsService userDetailsService) {
super(key, userDetailsService, tokenRepository);
}
public PersistentTokenRepository getTokenRepository() {
return tokenRepository;
}
public UserDetailsService getUserDetailsServiceInstance()
{
return getUserDetailsService();
}
}
But When I deploy application with above configuratio,I am getter below error
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#61fc8560': Cannot resolve reference to bean 'org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#0' while setting bean property 'logoutHandlers' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#0': Cannot resolve reference to bean '#{rememberMeServices.getTokenRepository()}' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinition
Exception: No bean named 'org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl@2a13c5e' is defined
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#0': Cannot resolve reference to bean '#{rememberMeServices.getTokenRepository()}' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl@2a13c5e' is defined
When I remove using spring expression language in
<security:remember-me ...>
tag and provide valid user ref instance,it is working fine.
But when I use spring expression language it is failing with above error.I doubt with ordering of bean creation.
Any one having Idea about this error ?
Upvotes: 0
Views: 8104
Reputation: 28706
The error message says everything :
Exception: No bean named 'org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl@2a13c5e' is defined
The token repository is not a bean. Indeed, if you look at your code, the TokenRepository is a static field. Instead of using a static field, declare it as a bean: in your xml config, add something like :
<bean id="tokenRepository"
class="org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl"/>
and replace the static field with something like :
@Autowired
private PersistentTokenRepository tokenRepository;
Spring, as a dependency injection framework , provides useful mechanisms to avoid usage of static reference: just use those mechanisms.
Upvotes: 2