0

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 ?

1 Answer 1

2

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Even after doing changes as you suggested,Still I am getting error.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@4d19bf23'. Beans are creating and autowiring fine.My only concern is expression language is not resolving in spring security tag.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.