【问题标题】:HttpSecurity Regex matcher not working as expectedHttpSecurity 正则表达式匹配器未按预期工作
【发布时间】:2018-10-02 07:09:27
【问题描述】:

我正在为 Spring Boot 休息服务器配置 HttpSecurity,我需要使创建用户端点不需要身份验证。

控制器方法的映射是POST /users/{username}?action=create

我生成了以下正则表达式,并使用在线工具对其进行了测试,以确保它正确匹配:

(\/users\/)([^\/]+)(\?action=create)

我对用户名的唯一规则是它们不能包含 /,因此我相信正则表达式可以满足这一点。

但是,尽管在 httpsecurity 配置中添加了以下内容:

.authorizeRequests()
.regexMatchers(HttpMethod.POST,"(\\/users\\/)([^\\/]+)(\\?action=create)")
.permitAll()

我仍然无法达到我的终点并且不确定原因。

谢谢!

更新:

显然,除非我将 WebSecurity 对象配置为完全忽略它,否则我的自定义过滤器将被应用,如下所示:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**", "/swagger-ui.html", "/webjars/**")
    .and().ignoring().regexMatchers(HttpMethod.POST, "(\\/users\\/)([^\\/]+)(\\?action=create)");
}

但现在 spring 抱怨找不到身份验证对象...

【问题讨论】:

  • HttpMethod.POST = 应该是 HttpMethod.GET 吗?
  • @JoeT 肯定是 POST,请求中包含提供其他详细信息的 json 对象。
  • 好的,我看到了这个“控制器方法的映射是 GET”
  • @JoeT 哦,我的错!固定
  • 由于正则表达式包含在 Java 字符串中,它不必有转义反斜杠吗? @JoeT

标签: java regex spring rest spring-security


【解决方案1】:

我最初的解决方案是授权已经过身份验证的请求,以下是所有请求(匿名或非匿名)都可以进行的!

将此添加到您的自定义 WebSecurityConfigurerAdapter

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**", "/swagger-ui.html", "/webjars/**")
    .and().ignoring().regexMatchers(HttpMethod.POST, "(\\/users\\/)([^\\/]+)(\\?action=create)");
}

为了清楚起见,这是它应用于的控制器方法:

@RequestMapping(value = "/users/{username}",params = {"action="+Action.CREATE}, method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public UserModel createUser(@PathVariable(value="username") String username, @RequestBody UserModel user) {

    user.setUsername(username);
    return userService.createUser(user);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 2017-09-10
    • 2022-01-02
    相关资源
    最近更新 更多