2017-11-17 4 views
1

Es ist mir gelungen, remember-me mit Spring-Boot-Sicherheit zu implementieren und Daten in meiner Tabelle persistent_logins (Benutzername, Serie, Token, last_used) zu speichern und in meinem Browser in Coockies zu finden. mein Problem ist, wenn ich die JSESSIONID aus meinem Browser löschen und den Browser Umleitung aktualisieren Sie die Seite und nicht noch in der gleichen Seite anmelden:Remember-me funktioniert nicht

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http.authorizeRequests().antMatchers("/sentEmail").permitAll(); 
    http.authorizeRequests().antMatchers("/contactUs").permitAll(); 
    http.authorizeRequests().antMatchers("/reset").permitAll(); 

    http.authorizeRequests().antMatchers(Constants.PATTERN1).permitAll(); 
    http.authorizeRequests().antMatchers(Constants.PATHPATTERN2).permitAll(); 
    http.authorizeRequests().antMatchers(Constants.PATHPATTERN3).permitAll().and().rememberMe().rememberMeServices(rememberMeServices());  
    http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage(Constants.URL_PATH).successHandler(this.authSuccess).failureHandler(this.authFailure).permitAll(); 
    http.authorizeRequests().anyRequest().authenticated().and().logout().logoutSuccessHandler(this.logoutSuccess).deleteCookies("JSESSIONID").invalidateHttpSession(false).permitAll(); 

    http.csrf().disable();} 
@Bean 
public BCrypt bCryptPasswordEncoder() { 
    return new BCrypt(); 
} 


@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder); 

} 

@Bean 
public AbstractRememberMeServices rememberMeServices() { 
    PersistentTokenBasedRememberMeServices rememberMeServices = 
     new PersistentTokenBasedRememberMeServices("AppKey",userDetailsService(),persistentTokenRepository()); 
    rememberMeServices.setParameter("rememberMe"); 
    rememberMeServices.setAlwaysRemember(true); 
    rememberMeServices.setCookieName("javasampleapproach-remember-me"); 
    rememberMeServices.setTokenValiditySeconds(24 * 60 * 60); 
    return rememberMeServices; 
} 



@Bean 
public PersistentTokenRepository persistentTokenRepository() { 
    JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); 
    tokenRepository.setDataSource(dataSource); 
    return tokenRepository;} 

und diese:

dies mein SecurityConfigWeb.java ist ist mein login.html für remember-me:

<div class="checkboxDiv"> 
         <input type="checkbox" name="remember-me" value="true"> <label class="check" for="checkbox">Stay Logged In</label> 
        </div> 

Irgendwelche Hilfe. Vielen Dank im Voraus

+0

Sie haben nur erinnern mich aktiviert für pattern3. Ihre Sicherheitskonfiguration ist komisch, ketten Sie alles in 1 Anruf ... –

+0

Entschuldigung M.Deinum ich verstehe Sie nicht, ich meine, ich sollte dies tun: http.authorizeRequests(). AntMatchers (Constants.PATTERN1) .permitAll(). Und() .rememberMe(). rememberMeServices (rememberMeServices()); http.authorizeRequests(). AntMatchers (Konstanten.PATHPATTERN2) .permitAll(). Und(). RememberMe(). RememberMeServices (rememberMeServices()); http.authorizeRequests(). AntMatchers (Konstanten.PATHPATTERN3) .permitAll(). Und(). RememberMe(). RememberMeServices (rememberMeServices()); ??? –

+1

Nein, Sie sollten 1 Kette haben, um Ihre Sicherheit zu konfigurieren ... –

Antwort

2

Das Problem ist, dass Sie Ihre Sicherheit in mehreren Anweisungen konfiguriert, anstatt die fließende API zu verwenden.

http.authorizeRequests().antMatchers(Constants.PATHPATTERN3).permitAll().and().rememberMe().rememberMeServices(rememberMeServices()); 

Mit dieser Zeile aktivieren Sie die ‚Remember Me‘ Funktionalität, sondern nur für Constants.PATHPATTERN3. Also, wenn Sie aktivieren möchten, erinnern Sie sich an mich für alle Ihre Endpunkte Ihre Sicherheitskonfiguration sollte so etwas sein.

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http.authorizeRequests() 
    .antMatchers("/sentEmail", "/contactUs", "/reset", Constants.PATTERN1,Constants.PATHPATTERN2, Constants.PATHPATTERN3).permitAll() 
    .anyRequest().authenticated() 
    .and() 
     .logout() 
     .logoutSuccessHandler(this.logoutSuccess).permitAll() 
    .and() 
     .formLogin() 
     .loginPage(Constants.URL_PATH) 
     .successHandler(this.authSuccess) 
     .failureHandler(this.authFailure).permitAll() 
    .and() 
     .rememberMe() 
     .tokenRepository(persistentTokenRepository()) 
     .key("AppKey") 
     .alwaysRemember(true) 
     .rememberMeParameter("rememberMe") 
     .rememberMeCookieName("javasampleapproach-remember-me") 
     .tokenValiditySeconds(24 * 60 * 60) 
    .and() 
     csfr().disable();  
} 

@Bean 
public PersistentTokenRepository persistentTokenRepository() { 
    JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); 
    tokenRepository.setDataSource(dataSource); 
    return tokenRepository; 
} 

Auf diese Weise konfigurieren Sie alles auf einmal.

+1

Vielleicht fügen Sie ein wenig mehr Informationen darüber hinzu, was das ursprüngliche Problem war und warum Ihr Code es behebt, würde die Qualität Ihrer Antwort verbessern. –

+0

@M. Deinum tut mir leid, dass ich verspätet reagiere, aber es ist immer noch das gleiche, wenn ich die jsessionid abrufe, bekomme ich die Login-Seite und das ist die Ausnahme, die ich bekomme: org.springframework.security.web.access.ExceptionTranslationFilter.handleSpringSecurityException: 173 - Zugriff verweigert (Benutzer ist anonym); Weiterleiten an Authentifizierungs-Einstiegspunkt org.springframework.security.access.AccessDeniedException: Accès refuséorg.springframework.security.web.authentication.remembere.RememberMeAuthenticationFilter.doFilter (RememberMeAuthenticationFilter.java:149) –

+0

Dann haben Sie keine Erinnerung an mich Cookie ... Stellen Sie sicher, dass der Name des Parameters "merke" mit dem konfigurierten übereinstimmt. Anstatt den Dienst manuell zu konfigurieren, empfehle ich den Namespace zu verwenden. –

Verwandte Themen