2012-04-04 8 views
1

Ich verwende eine benutzerdefinierte AuthenticationProvider:Frühling Sicherheit: Speichern-mich nicht mit benutzerdefinierten AuthenticationProvider funktioniert

public class CustomAuthenticationProviderImpl extends AbstractUserDetailsAuthenticationProvider { 

    @Resource(name="userDetailsService") 
    private UserDetailsService userDetailsService; 

    //....... 

} 

Ich versuche auch, die erinnern mich-Funktion zu verwenden:

<security:http auto-config="true" use-expressions="true" access-denied-page="/auth/accessDenied.xhtml" > 

    <!-- ........... --> 

    <security:remember-me user-service-ref="userDetailsService" key="some-string"/> 

</security:http> 

alles funktioniert außer für das Erinnerungs-Ich. Es funktionierte, wenn ich keine benutzerdefinierte AuthenticationProvider verwendet.

Was muss ich tun, damit das Remember-Me funktioniert?

public class AuthenticationSuccessHandlerImpl extends SimpleUrlAuthenticationSuccessHandler { 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException { 

     int timeout = 60*60; 

     request.getSession().setMaxInactiveInterval(timeout); //60 minutes 

     System.out.println("Session timeout of user: " + authentication.getName() + " has been set to: " + request.getSession().getMaxInactiveInterval() + " seconds."); 

     setDefaultTargetUrl("/views/home.jsf"); 

     super.onAuthenticationSuccess(request, response, authentication); 
    } 
} 

UPDAT 2:

Ich erhalte die folgende Debug-Ausgabe, wenn ich Tomcat neu starten

UPDATE

ich auch eine AuthenticationSuccessHandler verwende. Aber wenn ich das Login-Formular lade, und wenn ich es einreiche - sehe ich keinen Text, der remember in der Debug-Ausgabe enthält, und kein Remember-Me-Cookie wird erstellt.

DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,166 (DefaultSingletonBeanRegistry.java:217) - org.springframework.beans.factory.support.DefaultSingletonBeanRegistry getSingleton : 
Creating shared instance of singleton bean 'rememberMeFilter' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,166 (AbstractAutowireCapableBeanFactory.java:430) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory createBean : 
Creating instance of bean 'rememberMeFilter' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,182 (AbstractEnvironment.java:114) - org.springframework.core.env.AbstractEnvironment <init> : 
Initializing new StandardServletEnvironment 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,182 (MutablePropertySources.java:103) - org.springframework.core.env.MutablePropertySources addLast : 
Adding [servletConfigInitParams] PropertySource with lowest search precedence 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,182 (MutablePropertySources.java:103) - org.springframework.core.env.MutablePropertySources addLast : 
Adding [servletContextInitParams] PropertySource with lowest search precedence 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,182 (MutablePropertySources.java:103) - org.springframework.core.env.MutablePropertySources addLast : 
Adding [jndiProperties] PropertySource with lowest search precedence 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,182 (MutablePropertySources.java:103) - org.springframework.core.env.MutablePropertySources addLast : 
Adding [systemProperties] PropertySource with lowest search precedence 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,182 (MutablePropertySources.java:103) - org.springframework.core.env.MutablePropertySources addLast : 
Adding [systemEnvironment] PropertySource with lowest search precedence 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,182 (AbstractEnvironment.java:120) - org.springframework.core.env.AbstractEnvironment <init> : 
Initialized StandardServletEnvironment with PropertySources [servletConfigInitParams,servletContextInitParams,jndiProperties,systemProperties,systemEnvironment] 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,182 (AbstractAutowireCapableBeanFactory.java:504) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory doCreateBean : 
Eagerly caching bean 'rememberMeFilter' to allow for resolving potential circular references 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,182 (DefaultSingletonBeanRegistry.java:217) - org.springframework.beans.factory.support.DefaultSingletonBeanRegistry getSingleton : 
Creating shared instance of singleton bean 'rememberMeServices' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,182 (AbstractAutowireCapableBeanFactory.java:430) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory createBean : 
Creating instance of bean 'rememberMeServices' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,198 (AbstractAutowireCapableBeanFactory.java:504) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory doCreateBean : 
Eagerly caching bean 'rememberMeServices' to allow for resolving potential circular references 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,198 (AbstractBeanFactory.java:245) - org.springframework.beans.factory.support.AbstractBeanFactory doGetBean : 
Returning cached instance of singleton bean 'userDetailsService' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractAutowireCapableBeanFactory.java:1498) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory invokeInitMethods : 
Invoking afterPropertiesSet() on bean with name 'rememberMeServices' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractBeanFactory.java:245) - org.springframework.beans.factory.support.AbstractBeanFactory doGetBean : 
Returning cached instance of singleton bean 'org.springframework.security.methodSecurityMetadataSourceAdvisor' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractBeanFactory.java:245) - org.springframework.beans.factory.support.AbstractBeanFactory doGetBean : 
Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractAutowireCapableBeanFactory.java:458) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory createBean : 
Finished creating instance of bean 'rememberMeServices' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractBeanFactory.java:245) - org.springframework.beans.factory.support.AbstractBeanFactory doGetBean : 
Returning cached instance of singleton bean 'org.springframework.security.authenticationManager' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractAutowireCapableBeanFactory.java:1498) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory invokeInitMethods : 
Invoking afterPropertiesSet() on bean with name 'rememberMeFilter' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractBeanFactory.java:245) - org.springframework.beans.factory.support.AbstractBeanFactory doGetBean : 
Returning cached instance of singleton bean 'org.springframework.security.methodSecurityMetadataSourceAdvisor' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractBeanFactory.java:245) - org.springframework.beans.factory.support.AbstractBeanFactory doGetBean : 
Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractAutowireCapableBeanFactory.java:458) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory createBean : 
Finished creating instance of bean 'rememberMeFilter' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractBeanFactory.java:245) - org.springframework.beans.factory.support.AbstractBeanFactory doGetBean : 
Returning cached instance of singleton bean 'rememberMeServices' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (DefaultSingletonBeanRegistry.java:217) - org.springframework.beans.factory.support.DefaultSingletonBeanRegistry getSingleton : 
Creating shared instance of singleton bean 'rememberMeAuthenticationProvider' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractAutowireCapableBeanFactory.java:430) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory createBean : 
Creating instance of bean 'rememberMeAuthenticationProvider' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractAutowireCapableBeanFactory.java:504) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory doCreateBean : 
Eagerly caching bean 'rememberMeAuthenticationProvider' to allow for resolving potential circular references 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractAutowireCapableBeanFactory.java:1498) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory invokeInitMethods : 
Invoking afterPropertiesSet() on bean with name 'rememberMeAuthenticationProvider' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractBeanFactory.java:245) - org.springframework.beans.factory.support.AbstractBeanFactory doGetBean : 
Returning cached instance of singleton bean 'org.springframework.security.methodSecurityMetadataSourceAdvisor' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractBeanFactory.java:245) - org.springframework.beans.factory.support.AbstractBeanFactory doGetBean : 
Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 
DEBUG [pool-2-thread-1] 2012-04-16 09:18:11,213 (AbstractAutowireCapableBeanFactory.java:458) - org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory createBean : 
Finished creating instance of bean 'rememberMeAuthenticationProvider' 

Ich habe folgendes in meinem AuthenticationSuccessHandlerImpl:

System.out.println("_spring_security_remember_me after authentication = " + request.getParameter("_spring_security_remember_me"));

und der Ausgang ist:

_spring_security_remember_me after authentication = on

Aber nicht erinnern-me Cookie erstellt wurde!

+0

In welcher Weise funktioniert es nicht? Beispiel: Haben Sie die Übermittlung des Remember-Me-Cookies von Ihrem Browser verfolgt? Wird es gesetzt, wenn der Benutzer authentifiziert ist? Erhalten Sie Fehler im Protokoll? –

+0

@Luke Taylor: Ich habe die Antwort-Header (Firebug) ausgecheckt - keine Cookie-Header. Header anfordern - nur eine Kopfzeile für JSESSIONID-Cookie. Ich überprüfte Firefox Cookies für meine Domain (localhost) - nur JSESSIONID Cookie. Ich sehe keine Fehlermeldungen im Tomcat-Protokoll. Übrigens verwende ich auch einen 'AuthenticationSuccessHandler', siehe oben. – rapt

+0

@Luke Taylor: Ich benutze Spring Sicherheit zusammen mit JSF, nach diesem Beispiel: http://tutorials.slackspace.de/tutorial/Custom-login-page-with-JSF-und-Spring-Security-3 – rapt

Antwort

1

können Sie versuchen, Auto-Config zu deaktivieren: auto-config="false" und erklären RememberMeAuthenticationProvider direkt:

<bean id="rememberMeFilter" class= 
"org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter"> 
    <property name="rememberMeServices" ref="rememberMeServices"/> 
    <property name="authenticationManager" ref="authenticationManager" /> 
</bean> 

<bean id="rememberMeServices" class= 
"org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices"> 
    <property name="userDetailsService" ref="userService"/> 
    <property name="key" value="some-string"/> 
</bean> 

<bean id="rememberMeAuthenticationProvider" class= 
"org.springframework.security.authentication.RememberMeAuthenticationProvider"> 
    <property name="key" value="some-string"/> 
</bean> 
0

Für neueste Version von Spring Security, Sie Config, wie unten hinzufügen:

Es wird Ihnen helfen, einen Filter zu erstellen, der die automatische Anmeldung durchführt, wenn im Sicherheitskontext keine Anmeldeinformationen gefunden werden. Außerdem können Sie rememberMeServices und rememberMeAuthenticationProvider erstellen.

Sie sagten, bevor Sie den CustomAuthenticationProviderImpl umschreiben, kann es funktionieren. Also ich denke du hast es schon festgelegt.

Jetzt ist das Problem, Sie schreiben CustomAuthenticationProviderImpl, dann brechen Sie die ursprüngliche Zeile über die Erinnerung-mich.benötigen Sie zunächst rememberMeService in Ihrem benutzerdefinierten Anbieter setzen:

<beans:bean id="customFilter" class="..CustomAuthenticationProviderImpl "> 
    <beans:property ... /> 
    <beans:property name="rememberMeServices" ref="rememberMeServices" /> 
</beans:bean> 

Und Sie können mit diesem versuchen, wenn er sagt, dass die „rememberMeServices“ cann't finden, dann sollten Sie auch Dienst als Antwort erinnere mich gesetzt in oben.