безопасность URL для пользователя

Для URL, как

@RequestMapping(value = "/users/{userId}/update/password", method = RequestMethod.PUT)

как быть уверенным, что подключенный пользователь может изменять только свой пароль, а не пароль другого пользователя ...

на самом деле, у меня есть защита по URL-адресу ... но этого недостаточно, чтобы предотвратить это дело

http.authorizeRequests().antMatchers("/rest/users/**").hasRole("USER");
 holmis8322 июн. 2016 г., 09:22
Если вы поделитесь большим количеством кода, вы, вероятно, получите более точный ответ.
 bernard deromme22 июн. 2016 г., 13:49
нет кода, я задаю вопрос, прежде чем делать это.
 JB Nizet22 июн. 2016 г., 13:57
Убедитесь, что идентификатор подключенного пользователя совпадает с идентификатором пользователя в URL.

Ответы на вопрос(3)

Добавитьпринципал объект (какВот) в список аргументов вашего метода, чтобы подтвердить, что аутентифицированный пользователь является тем же пользователем, что и userId в URL-адресе API (выполните любые фоновые запросы DAO, необходимые для сопоставления userId и аутентифицированного пользователя). Верните 403 или 404, если это не так, в противном случае обновите пароль. Независимо от того, возвращаете ли вы 403 или 404, лучше быть последовательными и возвращать одно и то же число как для неавторизованных, так и для не найденных пользователей ситуаций, чтобы не предоставлять нежелательную информацию хакерам.

 bernard deromme22 июн. 2016 г., 18:42
интересно, если я не смог найти что-то с authorizeRequests ... я мог бы использовать этот способ + authorizeRequests
Решение Вопроса

Я полагаю, у вас есть аутентификация over / rest / users / **. Ты можешь получитьтекущий пользователь со следующим кодом.

YourUserPrincipalDto dto = (YourUserPrincipalDto) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Long userId = dto.getUserId();

YourUserPrincipalDto должен реализовыватьUserDetails.

 bernard deromme22 июн. 2016 г., 18:20
Итак, в этой команде нет способа проверить это: http.authorizeRequests (). antMatchers ("/ rest / users / **"). hasRole ("USER");

Предполагая, что у вас есть bean-компонент Spring с открытым методом с именем пользователя в качестве одного из аргументов (это может быть контроллер, уровень безопасности, уровень обслуживания или DAO), вы можете добавить@PreAuthorize аннотация:

@PreAuthorize("#username == authentication.name")
public void updateUserPassword(String username, String newPassword);

Вы должны включить предварительные и последующие аннотации в конфигурации безопасности, если это еще не сделано.

 Serge Ballesta22 июн. 2016 г., 14:59
Я бы тоже так пошел, но на уровне сервиса. Это действительно не должно быть на DAO.
 Serge Ballesta22 июн. 2016 г., 17:55
Во всяком случае, проголосовал, так как по крайней мере вы используете шаблон AOP вместо кодирования безопасности в классах, которые не должны иметь дело с ним.
 bernard deromme22 июн. 2016 г., 18:19
почему не на контроллере?
 holmis8323 июн. 2016 г., 10:06
@bernardderomme, если userId совпадает с username, вы можете поместить его в контроллер.

Ваш ответ на вопрос