2016-12-07 2 views
1

Comment dans Spring Security puis-je définir un chemin d'accès à l'URL de cookie RememberMe, qui diffère du chemin du contexte?Sécurité de printemps: comment puis-je définir un chemin d'accès au cookie RememberMe différent du chemin du contexte?

Supposant mon URL page d'accueil de site est (rewrite url):

https://www.mysuperspecialdomain.com 

Et que ma page de connexion a une URL comme ceci:

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

Après connexion réussie le cookie de RememberMe a le chemin /shop (visible dans le navigateur, par exemple Chrome) C'est le chemin du contexte du projet. Cela conduit à la situation, quand je vais à ma page d'accueil, RememberMe ne se connecte pas. Seulement quand je navigue à une URL, cela commence par https://www.myspecialdomain.com/shop il le fait.

Répondre

1

J'ai trouvé une solution à ma propre question - la manipulation du chemin du cookie RememberMe peut se faire via un HttpServletResponseWrapper. Ceci est la solution (basée sur cette réponse https://stackoverflow.com/a/7047298/7095884):

  1. Définition d'un 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); 
        } 
    } 
    
  2. Définir un filtre, qui enveloppe la réponse de servlet avec l'emballage vient d'être défini:

    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); 
         } 
        } 
    } 
    
  3. Ajoutez ce filtre à la chaîne de filtres de ressort en face de la pièce d'authentification:

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

Si vous utilisez la sécurité Spring 4.1.0 ou plus, vous pouvez configurer le domaine de cookie, voir RememberMeConfigurer#rememberMeCookieDomain:

Ce nom de domaine dans lequel le me souviens cookie est visible.

mais vous ne pouvez pas modifier le context path.

Vous devez donc implémenter votre propre RememberMeServices (vous pouvez créer une sous-classe d'un existant) et l'ajouter avec RememberMeConfigurer#rememberMeServices à votre configuration de sécurité.

+1

Merci. Tu as raison. Mais au lieu d'implémenter un nouveau 'RememberMeService', je préfère étendre un existant comme' TokenBasedRememberMeServices'. [Dans ce lien] (http://stackoverflow.com/questions/16015468/how-to-change-grails-spring-security-cookie-path) qui est décrit. Ma grande préoccupation: dès que j'utiliserais une nouvelle version de Spring, je devrais vérifier si la méthode 'setCookie' a été implémentée comme dans ma version étendue. Le ressort devrait offrir une option pour configurer ceci ... – olivmir

+1

J'ai trouvé une solution à ma propre question: [allez à ceci] (http://stackoverflow.com/a/41117823/7095884). L'avantage est que vous n'avez pas besoin de changer l'implémentation Spring RememberMeService. – olivmir