我正在为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)");
}
但是现在春天抱怨无法找到认证对象......
答案 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);
}