2017-11-17 27 views
1

私はスプリングブートセキュリティを使用してremember-meを実装し、テーブルpersistent_logins(username、series、token、last_used)にデータを格納し、ブラウザのコックで見つけようとしました。私の問題は、私は私のブラウザからJSESSIONIDを削除し、それをブラウザリダイレクトを更新ページにログインすると、同じページにはまだないときである。Remember-meが動作しない

これは私のSecurityConfigWeb.javaです:

@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;} 

と、この私のlogin.html私のために:

助けてください。事前に感謝します

+0

あなたは私がパターン3を有効にしていることを覚えています。あなたのセキュリティ設定は奇妙なもので、1つの呼び出しですべてをチェーンしています... –

+0

申し訳ありませんM.Deinum私はこれを行う必要があります:http.authorizeRequests()。antMatchers(Constants.PATTERN1).permitAll()。 ().rememberMe()。rememberMeServices(rememberMeServices()); rememberMeServices(rememberMeServices()); http.authorizeRequests()。antMatchers(Constants.PATHPATTERN2).permitAll()。および()。rememberMe()。 rememberMeServices(rememberMeServices()); http.authorizeRequests()。antMatchers(Constants.PATHPATTERN3).permitAll()。および()。rememberMe()。 ??? –

+1

セキュリティを設定するチェーンが1つありません... –

答えて

2

問題は、流暢なAPIを使用するのではなく、いくつかのステートメントでセキュリティを設定したことです。このラインでは

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

あなただけConstants.PATHPATTERN3のための「リメンバー・ミー」機能を活性化しました。ですから、すべてのエンドポイントについて私を覚えておきたいのなら、あなたのセキュリティ設定はこのようなものでなければなりません。

@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; 
} 

このようにして、すべてを一度に構成します。

+1

元の問題の内容と、コードが修正した理由についての情報を追加すると、回答の質が向上する場合があります。 –

+0

@M。 Deinum遅く返事して申し訳ありませんが、jsessionidを取得すると同じですが、ログインページが表示され、例外が表示されます:org.springframework.security.web.access.ExceptionTranslationFilter.handleSpringSecurityException:173 - アクセスが拒否されましたユーザーは匿名です)。認証エントリポイントにリダイレクト org.springframework.security.access.access.AccessDeniedException:Accèsrefuséorg.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:149) –

+0

次に、私のクッキーを覚えていない... remember meパラメーターの名前が構成済みパラメーターと一致することを確認します。また、手動でサービスを設定する代わりに、ネームスペースを使用することをお勧めします。 –

関連する問題