2013-04-11 13 views
5

silinemedi Kullanıcı oturumu kapattığında JSESSIONID tanımlama bilgisini silmem gerekiyor. Benim güvenlik yapılandırma için aşağıdaki yapılandırmayı eklemiş Bunu yapmak için:SpringSecurity: JSESSIONID

<http> 
    <form-login login-page="/login*" authentication-failure-url="/login?try_again" /> 
    <http-basic /> 
    <logout logout-url="/logout" delete-cookies="JSESSIONID" /> 
    <session-management invalid-session-url="/timeout" /> 

    <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 

    ... 

</http> 

Ama yerine silinmesini, çerez sadece yinelenmiş oldu edilir: Öyleyse

Old cookie

New cookie

tarayıcıyı "/ timeout" URL'sine yönlendirmeye devam eder.

Chrome web tarayıcısında Geliştirici Araçlarını kullanarak neler olduğunu tespit etmeye çalıştılar ve bu çerez bu yanıtı başlığıyla kurar öğrendim

:

Set-Cookie:JSESSIONID=CFF85EA743724F23FDA0317A75CFAD44; Path=/website/; HttpOnly 

Ve bu tepki başlığıyla siler:

Set-Cookie:JSESSIONID=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/website 

Emin değilim, ama bu başlıklardaki "Yol" alanında neden varmış gibi görünüyor: Birincisinde "/ website /" ye işaret ediyor, ikincisi ise "işaret ediyor" /Web sitesi".

Açıklanan sorunun sebebi bu mu? Nedeni değilse (ya da tek sebep değil), diğer sebep (ler) nedir? Bu sorunu nasıl düzeltebilirim?

+0

Bkz http://static.springsource.org/spring-security/site/docs/3.2.x/reference/springsecurity-single.html#ns-session- mgmt (Bölüm 3.3.3) ... Ne yazık ki, bu her sunucu kabı ile çalışacak şekilde garanti edilemez, bu yüzden ortamınızda test etmeniz gerekecektir. Ayrıca ilgili dipnota bakınız. – Ritesh

cevap

6

JSESSIONID Çerezini bu şekilde açıkça silmenize gerek yoktur. Spring Security tarafından bu şekilde değil, sunucu kasanız tarafından yönetilir. Spring Security, çıkışta varsayılan olarak http oturumunu geçersiz kılar, bu da sunucu kabuğunuzun JSESSIONID çerezini kaldırmasına neden olur.

çıkış yapınca nasıl silinir
<security:logout invalidate-session="true" logout-success-url="/myapp/auth/login" logout-url="/myapp/auth/logout" /> 
+2

http://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-session-mgmt, oturum yönetimi etiketlerini kullanıyorsanız, Çerezleri açıkça silin. – Richie

2

Bu benim oturumları geçersiz nasıl sen logoutu uygulamak ve yönteminde bu kodu koymak:

HttpSession session = request.getSession(false); 
    if (session != null) { 
     session.invalidate(); 
    } 

Yürürlükten oturumu çerezi geçersiz hale getirecektir.

Ama denedim ve oturum kapatma olmadan tarayıcıyı kapattığınızda, jsessionid çerez hayatta ve sisteme girmek mümkün kullanıcı, zaman tarayıcı açılır buldu.

bu ortadan kaldırmak için ben giriş baştan yapılacak yeni bir oturum oluşturma, çok girişte oturumu geçersiz bir filtre yarattı. SecurityContextLogoutHandler aramalar session.invalidate()JSESSIONID temizlenmiş olmaz olsa bile nedense Benim durumumda

@WebFilter(urlPatterns = {"/login/*"}, description = "sessionKiller", filterName="sessionKiller") 
public class SessionKillerFilter implements Filter{ 

    @Override 
    public void init(FilterConfig arg0) throws ServletException {} 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { 
     //kill older session and create new one on explicit login 
     //this is to prevent user to login 2-ce 
     //also this is prevention of re-connect on cookie base, when browser closed and then open 
     HttpServletRequest request = (HttpServletRequest)req; 
     HttpSession session = request.getSession(false); 
     if(session!=null){ 
      session.invalidate();//old session invalidated 
     } 
     request.getSession(true);//new session created 

     chain.doFilter(req, resp); 
    } 

    @Override 
    public void destroy() {} 
} 
1

basittir:

3

. Değeri aynı kaldı.

OP'nin denediği gibi delete-cookies="JSESSIONID"'u kullanmayı denedim ve aynı soruna sahip olduğuma inanıyorum: Çerez için ayarlanan yol, sonunda / olmayan bağlam yoluydu, bu yüzden hala temizlenemedi (Var olmayan bir çerezi silmek için emir veriyordu).

Ben çerez için bağlam yolunu belirler çizgi hariç CookieClearLogoutHandler için identic olan benim kendi ProperCookieClearLogoutHandler, yazma sona erdi:

package com.testdomain.testpackage; 

import java.util.Arrays; 
import java.util.List; 

import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.security.core.Authentication; 
import org.springframework.security.web.authentication.logout.LogoutHandler; 
import org.springframework.util.Assert; 
import org.springframework.util.StringUtils; 

public final class ProperCookieClearingLogoutHandler implements LogoutHandler { 
    private final List<String> cookiesToClear; 

    public ProperCookieClearingLogoutHandler(String... cookiesToClear) { 
     Assert.notNull(cookiesToClear, "List of cookies cannot be null"); 
     this.cookiesToClear = Arrays.asList(cookiesToClear); 
    } 

    public void logout(HttpServletRequest request, HttpServletResponse response, 
      Authentication authentication) { 
     for (String cookieName : cookiesToClear) { 
      Cookie cookie = new Cookie(cookieName, null); 
      String cookiePath = request.getContextPath() + "/"; 
      if (!StringUtils.hasLength(cookiePath)) { 
       cookiePath = "/"; 
      } 
      cookie.setPath(cookiePath); 
      cookie.setMaxAge(0); 
      response.addCookie(cookie); 
     } 
    } 
} 
Sonra

Ben spring-security.xml bu şekilde üzerine LogoutFilter için set config;

<bean id="logoutFilter" 
     class="org.springframework.security.web.authentication.logout.LogoutFilter"> 
     <constructor-arg name="logoutSuccessUrl" value="/views/login/login.xhtml?logout" /> 
     <constructor-arg> 
      <list> 
       <bean id="properCookieClearingLogoutHandler" 
        class="com.imatia.arpad.gplenos.authorization.ProperCookieClearingLogoutHandler"> 
        <constructor-arg name="cookiesToClear"> 
         <list> 
          <value>JSESSIONID</value> 
         </list> 
        </constructor-arg> 
       </bean> 
       <bean id="securityContextLogoutHandler" 
        class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"> 
       </bean> 
      </list> 
     </constructor-arg> 
     <property name="filterProcessesUrl" value="/logout" /> 
    </bean> 
0

yay tarafından sağlanan varsayılan CookieClearingLogoutHandler olabilir nedeniyle çerez yolunda bir farka net değil jsessionid.

Tanımlama bilgisi yolunu değiştirmemelisiniz. Bu çerez kimliğini değiştirir. Çerez/foo gibi bir yol için ayarlanmışsa ve bunu/olarak değiştirirseniz, istemci değiştirilen çerezi artık orijinal çerezle ilişkilendirmez. Bir çerez ismi ve yolu ile tanımlanır. Yukarıdaki çözüm yani (ProperCookieClearingLogoutHandler.class) gösterilen ve güvenliği bahar ayarlayın olarak .deleteCookies kullanmanın kod .Instead aşağıda gösterildiği gibi

nedenle özel bir CookieClearingLogoutHandler uygulamak gerekir ("jsessionid", "KULLANICI") CookieClearingLogoutHandler varsayılan olarak ekler.

Bahar Güvenlik Java yapılandırma:

@Configuration 
@EnableWebSecurity 
@ComponentScan(basePackages = "com.dentist.webapp") 
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private SessionRegistry sessionRegistry; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/resources/**", "/signup/*", "/about", "/login/*").permitAll().anyRequest() 
       .authenticated() 
       .and().formLogin() 
           .loginPage("/login/form") 
           .permitAll() 
       .and().logout() 
           .invalidateHttpSession(true) 
           .clearAuthentication(true) 
          // .deleteCookies("JSESSIONID","USER") 
           .addLogoutHandler(new ProperCookieClearingLogoutHandler("JSESSIONID","USER")) 
           .permitAll() 
       .and().sessionManagement() 
           .maximumSessions(1) 
           .maxSessionsPreventsLogin(true) 
           .expiredUrl("/accessDenied") 
           .sessionRegistry(sessionRegistry); 

     } 

    } 
İlgili konular