2016-04-26 39 views
10

Spring MVC uygulamasında expired-url'u yapılandırmam gerekiyor. İşte benim çaba, ancak hiçbir etkisi yoktur:Yay güvenliği - expiredUrl çalışmıyor

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .addFilterBefore(adminAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) 
     .addFilterBefore(customerAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) 
     .csrf() 
      .disable() 
     .authorizeRequests() 
      .antMatchers("...", "...", "...").permitAll() 
      .anyRequest().authenticated() 
     .and() 
      .formLogin() 
       .loginPage("/admin/login") 
     .and() 
      .logout() 
       .addLogoutHandler(customLogoutHandler()) 
       .logoutSuccessHandler(customLogoutSuccessHandler()) 
       .logoutUrl("/logout") 
     .deleteCookies("remove") 
     .invalidateHttpSession(true) 
      .permitAll() 
     .and() 
     .sessionManagement() 
      .maximumSessions(1) 
      .expiredUrl("/expired"); 

} 

Bu herhangi bir etkisi ve ne zaman kullanıcının oturum zaman aşımına, bahar /expired url onu yönlendirmez yok ve sadece /admin/login url onu yönlendirir.

Güncelleme: Denedim

görüş ve cevap çözümler önermiş, ancak herhangi bir etkisi görmedim. Ayrıca, yöntemin başında addLogoutHandler(), logoutSuccessHandler() ve iki addFilterBefore() kaldırdım, ancak çalışmaz.

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .addFilterBefore(sessionManagementFilter(), SessionManagementFilter.class) 
     .csrf() 
      .disable() 
     .authorizeRequests() 
      .antMatchers("...", "...", "...").permitAll() 
      .anyRequest().authenticated() 
     .and() 
      .formLogin() 
       .loginPage("/admin/login") 
     .and() 
      .logout() 
       .logoutUrl("/logout") 
     .deleteCookies("remove") 
     .invalidateHttpSession(true) 
      .permitAll(); 
} 

@Bean 
public SessionManagementFilter sessionManagementFilter() { 
    SessionManagementFilter sessionManagementFilter = new SessionManagementFilter(httpSessionSecurityContextRepository()); 
    sessionManagementFilter.setInvalidSessionStrategy(simpleRedirectInvalidSessionStrategy()); 
    return sessionManagementFilter; 
} 

@Bean 
public SimpleRedirectInvalidSessionStrategy simpleRedirectInvalidSessionStrategy() { 
    SimpleRedirectInvalidSessionStrategy simpleRedirectInvalidSessionStrategy = new SimpleRedirectInvalidSessionStrategy("/expired"); 
    return simpleRedirectInvalidSessionStrategy; 
} 

@Bean 
public HttpSessionSecurityContextRepository httpSessionSecurityContextRepository(){ 
    HttpSessionSecurityContextRepository httpSessionSecurityContextRepository = new HttpSessionSecurityContextRepository(); 
    return httpSessionSecurityContextRepository; 
} 

kimse bana bu sorunu çözmek için yardımcı olabilir misiniz:

Ayrıca ben bu şekilde başka bir çözüm çalıştı?

+3

@hamed, Tamam .. Sana '/ expired' url (Bu Geçmesinden için bir URL olduğundan bu tuhaf olduğunu biliyorum erişmek için gerekli izniniz yok sanırım! işleme), bahar zaman aşımına uğrayan sayfaya erişmek için bile giriş sayfasına yönlendirir .. Denemede acı yoktur .. Sadece ekleyin.antMatchers ("/ expired", "...", ...).() 'yi tıklayın ve şimdi zaman aşımına uğramış sayfaya veya yine de giriş sayfasına başarıyla yönlendirilip yönlendirilmediğinizi kontrol edin. Çalışmıyorsa bana bildirin .. –

cevap

8

: Öncelikle Bahar Güvenlik oturumu yaşam döngüsü olaylar hakkında güncel tutmak için web.xml dosyasına aşağıdaki dinleyici eklemeniz gerekir:

.sessionManagement().maximumSessions(1).and().invalidSessionUrl("/expired"); 

ve Coder izin URL'ler içinde "/expired" ekleyip sorun çözüldü dedi. Sorunuma dikkat eden herkese, yararlı yorumları için özellikle Ali Dehghani ve The Coder.

0

İdeal olarak UX'iniz, kullanıcıyı tekrar giriş sayfasına yönlendirmelidir. Ayrı giriş maskelerine sahip olmanız gerektiğinden haberdar olduğunuz, Spring MVC - change security settings dynamically nedeniyle ayrılmış/süresi dolmuş bir sayfaya sahip olmanın gerekliliğini görüyorsunuz. Çözüm (diğer sorunuzdaki cevabımda açıkladığım) sizin için çalışıyorsa, tahsis edilmiş/süresi dolmuş bir sayfaya sahip olma gereksiniminizi düşürebilir ve kullanıcıyı doğrudan doğruya yaklaşma sayfasını kullanarak doğru giriş sayfasına yönlendirebilirsiniz (2). Peki ya bu?

Yine de mevcut soruyu cevaplamak için o ama kodu bir deneyin ve değişim çalışmaları eğer ... emin değilim

 //... 
     .sessionManagement() 
     .maximumSessions(1) 
     .expiredUrl("/expired"); 
    } 

durumda

 //... 
     .sessionManagement().sessionFixation().newSession().maximumSessions(1) 
     .expiredUrl("/expired") 
     .sessionRegistry(sessionRegistry()); 
    } 

    @Bean 
    public SessionRegistry sessionRegistry() { 
     SessionRegistry sessionRegistry = new SessionRegistryImpl(); 
     return sessionRegistry; 
    } 

için o çalışmıyor, customLogoutHandler() ve customLogoutSuccessHandler() kodlarını yayınlayabilir misiniz? Spring Boot'ın dışında Spring MVC kullanıyorsunuz, değil mi? valid oturum kimliği işaretlenmiş ise

+0

'customLogoutHandler()' ve 'customLogoutSuccessHandler()' ı kaldırdım ve çözümünüzü denedim, ancak herhangi bir etki görmedim. Hala oturum zaman aşımına uğradığında, bahar beni giriş URL'sine yönlendiriyor. – hamed

5

ConcurrentSessionFilterSessionRegistry ayında sona erdi olarak, Spring Security reference bkz expiredUrl alana yönlendirme yapar:

- doldu-url bir kullanıcının kullanmaya kalkarsanız için yönlendirileceği URL Kullanıcı, izin verilen oturum sayısını aştığı ve başka bir yerde tekrar giriş yaptığı için eşzamanlı oturum denetleyicisinin "süresi dolduğu" bir oturum. exception-if-maximum-exceeded ayarlanmadığı sürece ayarlanmalıdır. Hiçbir değer sağlanmazsa, bir son kullanma mesajı doğrudan cevaba geri yazılır. Oturum kimliği valid (zaman aşımı veya yanlış ID) değilse

SessionManagementFilter

, invalidSessionUrl yönlendirme yapar, Spring Security reference bkz: kullanıcı şu anda kimlik doğrulaması yapılmamışsa

, filtre geçersiz olup olmadığını kontrol edecektir oturum kimliği istendi (örneğin bir zaman aşımı nedeniyle) ve ayarlanmışsa yapılandırılmış InvalidSessionStrategy çağrılır.En yaygın davranış yalnızca sabit bir URL'ye yönlendirmektir ve bu, standart uygulama SimpleRedirectInvalidSessionStrategy'da kapsüllenir. İkincisi, daha önce açıklandığı gibi ad alanı üzerinden geçersiz bir oturum URL'si yapılandırırken de kullanılır.

Her iki URL (expiredUrl, invalidSessionUrl) permitAll() olarak yapılandırılmış olması gerekmektedir. Tek bir kullanıcının yeteneğini kısıtlar için yer isterseniz

Eşzamanlı Oturum Kontrolü

:

BTW: Eğer maximumSessions ile Concurrent Session Control kullanmak istiyorsanız size web.xml için HttpSessionEventPublisher eklemek zorunda uygulamanıza giriş yapın, Spring Security bunu aşağıdaki basit eklentilerle kutunun dışına taşıyor. Ben bu şekilde (yorumlarda) Ali Dehghani 'ın çözüm çalıştı

<listener> 
    <listener-class> 
      org.springframework.security.web.session.HttpSessionEventPublisher 
    </listener-class> 
</listener> 
0

UserDetails ve UserDetailsService kullanırsanız, bunun nedeni UserDetails uygulama sınıfınızın geçersiz kılma yok olmasıdır çünkü hashCode() ve eşittir (Object obj) yöntemi. Bu UserDetails benim uygulama sınıfıdır:

public class MyUser implements UserDetails { 
    private String username; 

    private String password; 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    @Override 
    public Collection<? extends GrantedAuthority> getAuthorities() { 
     return null; 
    } 

    @Override 
    public String getPassword() { 
     return null; 
    } 

    @Override 
    public String getUsername() { 
     return null; 
    } 

    @Override 
    public boolean isAccountNonExpired() { 
     return false; 
    } 

    @Override 
    public boolean isAccountNonLocked() { 
     return false; 
    } 

    @Override 
    public boolean isCredentialsNonExpired() { 
     return false; 
    } 

    @Override 
    public boolean isEnabled() { 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     return username.hashCode(); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return this.toString().equals(obj.toString()); 
    } 
} 
İlgili konular