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 规范之后附加一个星号 (*),您应该可以实现您的目标。
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/**");
,因为我之前遇到过类似的问题,错误端点也得到了验证。希望这有帮助。
我试图在 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 规范之后附加一个星号 (*),您应该可以实现您的目标。
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/**");
,因为我之前遇到过类似的问题,错误端点也得到了验证。希望这有帮助。