2017-10-11 1 views
-1

Je travaille sur une application de démarrage à ressort où j'ai défini mon filtre à exécuter pour gérer l'obtention et la validation du jeton. Donc, dans ma configuration de classe de sécurité Web, j'ai réussi à le faire:Filtre Jwt accessible même sur les URL autorisées

@Override 
    protected void configure(HttpSecurity httpSecurity) throws Exception { 
     httpSecurity 
       // we don't need CSRF because our token is invulnerable 
       .csrf().disable() 

       // don't create session 
       .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() 

       .authorizeRequests() 
       // .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 

       // allow anonymous resource requests 
       .antMatchers(HttpMethod.GET, "/", "/*.html", "/favicon.ico", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() 
       .antMatchers("/auth/**").permitAll() 
       .antMatchers("/places/public").permitAll() 

       .anyRequest().authenticated(); 

     // Custom JWT based security filter 
     httpSecurity.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class); 

     // disable page caching 
     httpSecurity.headers().cacheControl(); 
    } 

Le authenticationTokenFilterBean est une méthode annotée avec @Bean qui renvoie une instance de mon filtre:

public class JwtFilter extends OncePerRequestFilter{ 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Autowired 
    private JwtService jwtService; 

    @Value("${jwt.header}") 
    private String authorizationHeader; 

    @Override 
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { 

     String token = httpServletRequest.getHeader(authorizationHeader); 

     String username = jwtService.getUsernameFromToken(token); 

     if(username!=null && SecurityContextHolder.getContext().getAuthentication() ==null){ 
      UserDetails userDetails = userDetailsService.loadUserByUsername(username); 

      if(jwtService.isTokenValid(token, userDetails)){ 
       UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); 
       authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest)); 
       SecurityContextHolder.getContext().setAuthentication(authenticationToken); 
      } 
     } 

     filterChain.doFilter(httpServletRequest, httpServletResponse); 
    } 

} 

Depuis que je suis extension OncePerRequestFilter, ce filtre est appelé une seule fois par requête, ce qui n'est pas le cas avec GenericFilter qui doit être exécuté une fois par la servlet et une autre fois avec la sécurité de Spring. Le problème que j'ai est que les antchiffres décrits dans ma classe de configuration sont également interceptés par le filtre même si je les autorise avec la méthode permitAll(), j'ai essayé de surcharger la méthode configure (WebSecurity web) depuis WebSecurityConfigurerAdapter et les ignorer mais ne fonctionnait toujours pas.

Comment est-ce que je peux configurer la sécurité de ressort pour passer mon filtre pour ces demandes? J'ai déjà vérifié cette question Spring Security JWT Filter applies on all requests mais il n'a pas de solution.

Merci

+0

Vous pouvez toujours construire une autre/seconde configuration sans votre filtre pour certaines URL. – dur

Répondre

-1

-je éviter ce problème de cette façon, vous pouvez prendre pour référence:

@Override 
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException { 
    if("/login".equals(req.getServletPath()) && "POST".equalsIgnoreCase(req.getMethod())){ 
     // ...... 
    } 
    filterChain.doFilter(req, res); 
} 
+0

Ceci est géré à l'intérieur du filtre qui est ce que je veux éviter. Merci quand même – Habchi