Защита определенных полей при связывании в Spring - PullRequest
9 голосов
/ 17 февраля 2011

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

Это реализовано в Spring MVC (3.0). Объект User имеет типичные поля, такие как firstName, lastName, email (все должны быть редактируемыми) и логическое значение administrator (которые не должны редактироваться.

Мой метод выглядит примерно так:

@RequestMapping(method = RequestMethod.POST)
public String doEdit(
        @ModelAttribute("user") User user,
        BindingResult result,
        ModelMap model)
throws IOException
{
      // validate, blah blah
      // save user object
      // return page

}

Моя форма содержит поля firstName, lastName и т. Д. И, кажется, работает нормально.

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

Я знаю, что могу создать отдельный объект "формы" только с полями, которые я хочу изменить, и использовать его для автоматической привязки. (копия данных). Проблема в том, что у меня есть много мест, которые используют эту технику. (для пользователя и других объектов). Было бы сложно поддерживать, когда я хочу добавить поля.

Есть ли способ использовать аннотации или другие методы в Spring MVC для внесения в белый список параметров и предотвращения изменений в свойствах произвольных доменных объектов?

Ответы [ 3 ]

10 голосов
/ 17 февраля 2011

DataBinder имеет два свойства с именами allowedFields и disallowedFields, которые определяют, что (dis) разрешать для привязки.Просто используйте это в вашем @InitBinder методе:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setDisallowedFields("administrator");
}
3 голосов
/ 17 февраля 2011

Вы можете отфильтровать запрос с помощью выражений стиля "! MyParam", чтобы указать, что указанный параметр не должен присутствовать в запросе.

@RequestMapping(params="!administrator")
0 голосов
/ 17 февраля 2011

Не отправляйте этот параметр administrator на сторону клиента, управляйте им на стороне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...