SpringBoot websecurity 不会忽略 url 如果它有参数

SpringBoot websecurity doesn't ignore a url if it has params

我试图在 SpringBoot 中忽略来自 WebSecurity 的 url。能够做到精确 url 匹配。但是如果 url 本身有一个参数,它就不能忽略它。有没有更好的方法来忽略 url,比如忽略特定的控制器。如果没有,如何解决参数问题?

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/api/v1/something");
    // was able to ignore [url]/api/v1/something but not [url]/api/v1/something?xyz=wjsbjbjbsjbw
}

尝试使用通配符。

web.ignoring().antMatchers("/api/v1/something/**");

尝试使用 HttpSecurity

@Override
public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/api/v1/something/**").permitAll();
}

这应该适合你。

[url]/api/v1/something?xyz=wjsbjbjbsjbw

替换如下 "wjsbjbjbsjbw" = *

那么新 URL 会是

[url]/api/v1/something?xyz=*

/之后的每个值都可以视为*

我不确定 something 是什么,否则你也可以做到 *

或者其他肯定有效的方法是

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("[url]/api/v1");
}

有关详细信息,请参阅 Spring Security Samples

您可以使用 regexmatchers 进行相同的操作。

public void configure(WebSecurity web) throws Exception {
      web.ignoring().regexMatchers("/api/v1/something.*");
}

如果您在当前的 antMatcher 规范之后附加一个星号 (*),您应该可以实现您的目标。

Per definition:

The mapping matches URLs using the following rules:

  • ? matches one character
  • * matches zero or more characters
  • ** matches zero or more directories in a path
  • {spring:[a-z]+} matches the regexp [a-z]+ as a path variable named "spring"

您的代码的重要片段可能如下所示:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/api/v1/something*");
}

对于与路径相关的安全配置,您也可以使用带有类型 HttpSecurity 参数的其他重载配置方法来实现相同的效果,如下所示:

@Override
public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/api/v1/something*").permitAll();
}

如定义中所述,您还可以更进一步,在以 /** 结束 AntMatcher 时允许该路径下的任何内容。但这实际上取决于您的用例。 有关实施细节,请查看 Spring AntPathRequestMatcher


您对应的请求映射应如下所示(@GetMapping 示例)。重要的是,您的路径没有尾随 /.

@GetMapping("/api/v1/something")
public ResponseEntity<String> getSomething(@RequestParam(value = "xyz", required = false) String xyz){
    return ResponseEntity.ok("Called with xyz param: " + xyz);
}

web.ignoring().antMatchers("/api/v1/something/**"); 应该可以正常工作,但请检查您是否包含了 web.ignoring().antMatchers("/error/**");,因为我之前遇到过类似的问题,错误端点也得到了验证。希望这有帮助。