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

Posted

技术标签:

【中文标题】如果有参数,SpringBoot websecurity 不会忽略 url【英文标题】:SpringBoot websecurity doesn't ignore a url if it has params 【发布时间】:2019-08-02 03:45:39 【问题描述】:

我试图忽略 SpringBoot 中 WebSecurity 的 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

【问题讨论】:

添加“*”发布你的网址,它会为你工作 【参考方案1】:

尝试使用通配符。

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

【讨论】:

没有成功,但谢谢。仍然 /api/v1/something 被忽略,但不带参数【参考方案2】:

HttpSecurity试试吧

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

【讨论】:

【参考方案3】:

这应该适合你。

[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

【讨论】:

【参考方案4】:

您也可以使用regexmatchers

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

【讨论】:

【参考方案5】:

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

Per definition:

映射使用以下规则匹配 URL:

?匹配一个字符 * 匹配零个或多个字符 ** 匹配路径中的零个或多个目录 spring:[a-z]+ 匹配正则表达式 [a-z]+ 作为名为“spring”的路径变量

您的代码中重要的 sn-p 可能如下所示:

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

您也可以使用其他重载的 configure 方法和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);

【讨论】:

【参考方案6】:

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

【讨论】:

这是问题所在,我尝试调试代码。由于其他代码,错误被抛出。

以上是关于如果有参数,SpringBoot websecurity 不会忽略 url的主要内容,如果未能解决你的问题,请参考以下文章

WebAPI + SimpleMembership + WebSecurity - 永远无法进行身份验证?

Asp.Net Mvc4 WebSecurity 如何激活或停用用户帐户

LINQ to Entities 无法识别方法 ElementAt[WebSecurity.CurrentUserId]

使用.ignoring()的Spring WebSecurity配置不起作用

HttpSecurity permitAll 和 WebSecurity 忽略 un-Auth URL 的功能?

「干货」SpringBoot+SpringSecurity+Jwt权限认证-认证