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

2022-09-01 03:10:02

我一直在寻找答案很长一段时间,但找不到任何富有成效的东西

在我的休息服务中,我在以下位置保留了一些功能:/account/{id}/download,我想在SecurityConfig java文件中设置acce role,只有ROLE_TOKENSAVED用户可以访问此URL

当 {id} 是可更改的时,模式应该是什么样子?

我尝试了一些正则表达式模式,但没有任何东西按照我想要的方式工作,以下是我的一些尝试:

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...
    }

答案 1

这对我有用:

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

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


答案 2

虽然博胡斯拉夫的建议有效,但它并不完整。根据AntPathMarcher的文档:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/AntPathMatcher.html

您需要使用正则表达式指定路径变量:

{spring:[a-z]+} matches the regexp [a-z]+ as a path variable named "spring"

如果不这样做,则可能会公开其他路由。例如:

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

和用户控制器上的这些方法:

@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();
}

由于您没有指定路径变量,因此用户将能够在没有管理员权限的情况下对“/users/roles”执行 GET 请求。此外,即使需要管理员授权,“/users/test”等其他期货路由也将公开。为防止这种情况发生,userId

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

如果路径变量的名称为“accountId”