java - Spring 安全配置 - addFilterBefore 不适用于 PUT、PATCH 和 DELETE
问题描述
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();
}
通过执行请求我得到
已解决 [org.springframework.web.HttpRequestMethodNotSupportedException:不支持请求方法“PUT”]
当我将其更改为GetMapping
请求时正在正确处理。
在设置日志之后,logging.level.org.springframework.web=DEBUG
我可以看到PUT
不支持不是从“/forbidden”返回,/v2/api/dashboard/projects
而是从“/forbidden”返回,出于明显的原因,它不支持此类方法。
进一步的调试调查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
方法将被给定的类过滤?
解决方案
推荐阅读
- sql-server - INSERT INTO SELECT 查询的正确语法
- javascript - 期望输入结束,“ADD”、“SUB”、“MUL”、“DIV”,得到意外的“RPAREN”
- python - 如何在 pytorch 中使用 GPU?
- sql - SQL 识别在给定年份下超过 X 个订单的客户
- f# - FSharp.Compiler.Service FSharpChecker 在引用 IAsyncDisposable 时无法编译动态程序集
- php - 当我进行 Axios POST 时,我得到 419(未知状态)错误 0
- java - 使用测试代码修补 Java 9 模块以处理反射
- laravel - 预期响应代码 354,但得到代码“503”,消息“503 5.5.1 RCPT first. w15sm3670747wrs.80 - gsmtp”
- spring - Spring AsyncTaskExecutor 返回不抛出异常的期货
- javascript - 使用 React 和 Enzyme 测试 Javascript 类属性