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);
}
...
Лучший подход, как указано в ответе Тома. это просто.