HttpSecurity Regex匹配器未按预期工作

时间:2018-04-21 22:28:07

标签: java regex spring rest spring-security

我正在为Spring Boot rest服务器配置HttpSecurity,我需要让create user端点不需要身份验证。

控制器方法的映射是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)");
}

但是现在春天抱怨无法找到认证对象......

1 个答案:

答案 0 :(得分: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);

}