Я подготовил конфигурацию для Spring security
для API
вызовов. Он должен проверить JWT
токен, указанный в запросе.
http.csrf().disable().authorizeRequests()
.antMatchers("/v2/api/**/*").authenticated().and()
.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
и метод моего контроллера
@PreAuthorize("hasAuthority('ROLE_USER')")
@PutMapping(value = "/v2/api/dashboard/projects")
public List<Projects> getProjects(Principal principal) {
return dashboardService.getProjects();
}
, и, выполнив запрос, я получу
Resolved[org.springframework.web.HttpRequestMethodNotSupportedException: метод запроса 'PUT' не поддерживается]
Когда я изменяю его на GetMapping
, запрос обрабатывается должным образом.
После регистрации параметров изlogging.level.org.springframework.web=DEBUG
Я вижу, что PUT
не поддерживается не возвращается из /v2/api/dashboard/projects
, но из '/ запрещено', которое по понятным причинам не поддерживает такие методы.
Дальнейшее исследование с отладкой jwtRequestFilter
показалоэтот фильтр даже не выполняется на PUT
, PATCH
или DELETE
методах.
код его:
@Component
public class JwtRequestFilter extends OncePerRequestFilter {
private static final Logger log = LoggerFactory.getLogger(JwtRequestFilter.class);
@Autowired
private JwtUserDetailsService jwtUserDetailsService;
@Autowired
private JwtUtils jwtTokenUtil;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
String requestTokenHeader = "";
try{
requestTokenHeader = WebUtils.getCookie(request, "token").getValue();
} catch (NullPointerException ex ){}
String username = null;
String jwtToken = null;
if (requestTokenHeader != null && requestTokenHeader.contains(".")) {
jwtToken = requestTokenHeader;
try {
username = jwtTokenUtil.getUsernameFromToken(jwtToken);
} catch (IllegalArgumentException e) {
log.error("Unable to get JWT Token");
} catch (ExpiredJwtException e) {
log.error("JWT Token has expired");
}
} else {
logger.warn("JWT Token does not look like token");
}
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = this.jwtUserDetailsService.loadUserByUsername(username);
if (jwtTokenUtil.validateToken(jwtToken, userDetails)) {
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
usernamePasswordAuthenticationToken
.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
}
}
chain.doFilter(request, response);
}
}
Может кто-нибудь дать мне подсказку, как заставить его работатьпоэтому методы PUT
и PATCH
будут отфильтрованы с данным классом?