2016-12-07 8 views
1

Springセキュリティでは、コンテキストパスとは異なるRememberMe Cookie URLパスをどのように設定できますか?私のウェブサイトのホームページのURLを想定Spring Security:コンテキストパスと異なるRememberMe Cookie URLパスを設定するにはどうすればよいですか?

(URL書き換え)である:

https://www.mysuperspecialdomain.com 

そして、私のログインページでは、このようなURLがあること:リメンバー・ミークッキーは、パスを持っている

https://www.mysuperspecialdomain.com/shop/account/login 

成功し、ログインした後に/shop (Chromeなどのブラウザに表示されます)。これはプロジェクトのコンテキストパスです。

これは私が自分のホームページに行くときRememberMeがログインしていないという状況に繋がります。私がURLに移動したときに初めて、https://www.myspecialdomain.com/shopで始まります。

答えて

1

私自身の質問に対する解決策を見つけました。RememberMeクッキーのパスの操作は、HttpServletResponseWrapperで行うことができます。

public class RememberMeCookieResponseWrapper extends HttpServletResponseWrapper { 
    public RememberMeCookieResponseWrapper(HttpServletResponse response) { 
     super(response); 
    } 

    @Override 
    public void addCookie(Cookie cookie) { 
     if (cookie.getName().equals("shop")) { 
      cookie.setPath("/"); 
     } 
     super.addCookie(cookie); 
    } 
} 
  • は、フィルタを定義し、単に定義されたラッパーとサーブレット応答ラップ:

    public class RememberMeCookieFilter implements Filter { 
    
        public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain chain) throws IOException, ServletException { 
    
         if (response instanceof HttpServletResponse) { 
          HttpServletResponse newResponse = 
           new RememberMeCookieResponseWrapper((HttpServletResponse)response); 
          chain.doFilter(request, newResponse); 
         } 
        } 
    } 
    

    1. がHttpServletResponseWrapperをを定義します。これは、(この回答https://stackoverflow.com/a/7047298/7095884に基づく)ソリューションであります

    2. このフィルタを認証パートの前のスプリングフィルタチェーンに追加します。

      @Configuration 
      @EnableWebSecurity 
      public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
      
          @Override 
          protected void configure(HttpSecurity http) throws Exception { 
      
           http.addFilterBefore(new RememberMeCookieFilter(), UsernamePasswordAuthenticationFilter.class) 
           ... 
      
  • 2

    あなたは春のセキュリティ4.1.0以降を使用する場合は、あなたがRememberMeConfigurer#rememberMeCookieDomainを参照して、Cookieドメインを設定することができます。

    私を覚えてクッキーが表示されている範囲内のドメイン名。

    ただし、context pathは変更できません。

    RememberMeServicesを実装する必要があります(既存のサブクラスを作成してRememberMeConfigurer#rememberMeServicesと追加することができます)。

    +1

    ありがとう。あなたが正しいです。しかし、新しい 'RememberMeService'を実装する代わりに、' TokenBasedRememberMeServices'のような既存のものを拡張することを好みます。 [このリンクの](http://stackoverflow.com/questions/16015468/how-to-change-grails-spring-security-cookie-path)を参照してください。私の大きな懸念は:まもなく、新しいSpringバージョンを使用するように、 'setCookie'メソッドが拡張バージョンのように実装されているかどうかをチェックする必要があります。春はこれを設定するオプションを提供する必要があります... – olivmir

    +1

    私は自分の質問への解決策を見つけました:[これに行く](http://stackoverflow.com/a/41117823/7095884)。利点は、SpringのRememberMeService実装を変更する必要がないことです。 – olivmir

    関連する問題