SpringBoot: обойти фильтры OncePerRequestFilter

У меня есть базовое приложение SpringBoot 2.0.5.RELEASE. Использование Spring Initializer, JPA, встроенного Tomcat, механизма шаблонов Thymeleaf и пакета в качестве исполняемого файла JAR.

Я создал специальный фильтр безопасности JWT на основе JwtFilter:

@Provider
public class JwtAuthorizationTokenFilter extends OncePerRequestFilter {
...
}

Но я хочу обойти этот фильтр только для 1 конкретного запроса / метода:"/api/v1/menus"когда это POST

Но я не знаю, возможно ли это в WebSecurityConfigurerAdapter:

 JwtAuthorizationTokenFilter authenticationTokenFilter = new JwtAuthorizationTokenFilter(userDetailsService(), jwtTokenUtil, tokenHeader);
     httpSecurity
         .addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
          .antMatcher("/api/v1/menus")

2 ответа

Решение

Вы можете переопределить shouldNotFilter метод из OncePerRequestFilter, как показано ниже:

@Provider
public class JwtAuthorizationTokenFilter extends OncePerRequestFilter {
    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
        return new AntPathMatcher().match("/api/v1/menus", request.getServletPath());
    }

}

Я использовал для проверки HttpServletRequest для пути URI и использовал цепочку фильтров для передачи запроса и ответа в цепочке.

как показано ниже

      
public class JwtRequestFilter extends OncePerRequestFilter {

....

@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse respone, FilterChain chain) throws ServletException, IOException {

....
String urlPath = request != null ? request.getRequestURI():null;
        String[] splitPath = urlPath != null? urlPath.split("/"):null;
        String currentPath = splitPath!=null?splitPath[splitPath.length-1]:null;
        List<String> allowedPath = Arrays.asList("about","info","authenticate");
        if(currentPath != null && allowedPath.contains(currentPath)){
            SecurityContextHolder.getContext().setAuthentication(null);
            chain.doFilter(request, respone);
        }
...

Лучший подход, как указано в ответе Тома. это просто.

Другие вопросы по тегам