AntMatchers Spring Шаблон безопасности с изменяемым идентификатором пользователя URL

Я искал ответ в течение долгого времени, но не смог найти ничего продуктивного

В моем сервисе отдыха я сохраняю некоторые функции:/account/{id}/download, и я хотел бы установить acces ROLE в java файле SecurityConfig, что только пользователи 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')")

Обратите внимание на фигурные скобки вокруг переменной пути, представляющей идентификатор.

Ответ 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"

Если вы этого не сделаете, вы можете открыть другие маршруты. Например:

http .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, пользователи смогут выполнять запрос GET на "/users/role" без полномочий администратора. Также будут открыты другие фьючерсные маршруты, такие как "/users/test", даже если требуется авторизация администратора. Чтобы предотвратить это:

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

если ваше имя переменной пути было "accountId"