antMatchers具有可更改URL用户ID的Spring安全模式

mec1mxoz  于 2022-12-28  发布在  Spring
关注(0)|答案(3)|浏览(140)

我找了很长时间的答案,但没有找到任何有成效的东西
在我的休息服务中,我将一些功能保留在:/account/{id}/download,我希望在SecurityConfig java文件中设置访问权限ROLE,以便只有ROLE_TOKENSAVED用户才能访问此URL
当{id}可更改时,模式应该是什么样子?
我尝试了一些regexp模式,但没有一个像我想要的那样工作,下面是我的一些尝试:

1. antMatchers("account/**/download").access(somerolehere)
2. antMatchers("account/\\d/download").access(somerolehere)
3. antMatchers("account/[\\d]/download").access(somerolehere)

提前感谢你的回答:)
编辑:

@Override
    protected void configure(HttpSecurity http) throws Exception {            
        http.authorizeRequests()
                .antMatchers("/admin**").access("hasRole('ROLE_ADMIN')")
                .antMatchers("/account*//**").access("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
                .antMatchers("/account/\\d+/download").access("hasRole('ROLE_TOKENSAVED')")
                .antMatchers("/user**").permitAll()
                //othercode...
    }
fnx2tebb

fnx2tebb1#

这对我很有效:

antMatchers("/account/{\\d+}/download").access("hasAnyAuthority('ROLE_TOKENSAVED')")

请注意表示ID的路径变量周围的花括号。

rta7y2nd

rta7y2nd2#

虽然Bohuslav的建议有效,但它并不完整。根据AntPathMarcher的文档:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/AntPathMatcher.html
您需要使用regex指定路径变量:
第一个月
如果不这样做,可能会暴露其他路由。例如:

.authorizeRequests()
        .antMatchers(HttpMethod.GET, "/users/{^[\\d]$}").authenticated()
        .antMatchers("/users/**").hasAuthority("admin")

和UserController上的这些方法:

@ResponseBody
@RequestMapping(value = "/users/{userId}", method = RequestMethod.GET)
public User getUser(@PathVariable("userId") Object id) {
    return userService.getUserById(userId);
}

@ResponseBody
@RequestMapping(value = "/users/roles", method = RequestMethod.GET)
public List<String> getAllRoles() {
    return userService.getAllRoles();
}

由于您没有指定路径变量userId,用户将能够在没有管理员权限的情况下在“/users/roles”上执行GET请求。此外,即使需要管理员权限,“/users/test”等将来路径也将暴露。

antMatchers("/account/{accountId:\\d+}/download")
       .access("hasAnyAuthority('ROLE_TOKENSAVED')")

如果路径变量名称是“accountId”

mitkmikd

mitkmikd3#

我想我也遇到过类似的问题,在大多数情况下,类似antMatchers(“/items/{\d+})的东西不起作用,但如果我读到antMatchers(“/items/{d+})(没有//),它就起作用了。

相关问题