Ответ 1
Это работает для меня:
antMatchers("/account/{\\d+}/download").access("hasAnyAuthority('ROLE_TOKENSAVED')")
Обратите внимание на фигурные скобки вокруг переменной пути, представляющей идентификатор.
Я искал ответ в течение долгого времени, но не смог найти ничего продуктивного
В моем сервисе отдыха я сохраняю некоторые функции:/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...
}
Это работает для меня:
antMatchers("/account/{\\d+}/download").access("hasAnyAuthority('ROLE_TOKENSAVED')")
Обратите внимание на фигурные скобки вокруг переменной пути, представляющей идентификатор.
Хотя Богуслав предлагает работать, он не является полным. Согласно документации 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"