2015-08-21 5 views
1

Я просто пытаюсь понять «валидацию» в Spring MVC. Я создал небольшую форму проверки, которая работает отлично. Тем не менее, я получил пару вопросов, все те учебники не отвечаютВалидация весной с разными ролями

Насколько я понял, Validator просто получает каждый измененный элемент формы и проверяет, действительно ли он или нет. Что делать, если я хочу, чтобы пользователь мог изменять только определенные элементы формы.

Предположим, у меня есть администратор и обычный пользователь на моей веб-странице, им разрешено редактировать свои профили. Администратору, однако, разрешено изменять его имя пользователя, ему не разрешено делать это. Они оба используют «edit-profile.jsp» и, следовательно, тот же валидатор. Я мог бы просто очертить поле имени пользователя в представлении моего обычного пользователя, но предположим, что он не является полным BDU и добавляет поле формы через отладчик своего веб-браузера, переопределяя фактическое поле ввода имени пользователя. Затем он изменяет свое имя пользователя и отправляет запрос в MVC. Валидатор предполагает, что имя пользователя изменилось из исходного поля ввода и соответственно обновляет псевдоним пользователя в db, так как оба администратора и обычный пользователь просто используют один и тот же валидатор и тот же метод «updateAllAltered» -DAO. То же самое касается выбора опций-списков. Допустим, администратору разрешено устанавливать статус активного и неактивного профиля. Однако пользователю разрешено устанавливать его собственный профиль неактивным, но он не может его повторно активировать. Я мог бы сделать то же самое, что и выше, просто изменив панель параметров в интерфейсе, чтобы показать только «НЕАКТИВНО» в раскрывающемся списке обычного пользователя. Но мы могли бы повторить тот же сценарий, когда пользователь просто добавляет поле формы отладки, содержащее также опцию «ACTIVE». Это может выйти из-под контроля, если, например, администратору разрешено изменять роли в «admin, member, moderator», а пользователь, который является, например, модератором на форуме, может изменять роли в «член или модератор». Он мог бы просто добавить еще одно поле и плагин «admin» и получить полный контроль над форумом.

Как это обрабатывается весной?

ответ

0

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

Пример: вы можете заблокировать свой HTML-код в JSP весенними тегами безопасности по ролям пользователей.

<sec:authorize access="hasAnyRole('ROLE_ADMIN')"> 
           <a href="delete/${file.id}">Delete</a> 
          </sec:authorize> 

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

@Secured({ "ROLE_ADMIN" }) 
+0

Ну, это еще не решило проблему http-запроса. Функция update(), которая является DAO-методом для обновления записи пользователя, вызывается как от обычного пользователя, так и от администратора. Таким образом, оба имеют доступ к этому методу. Метод frontend с просто скрывает ссылку, если вы не админ, но если вы должны взломать эту кнопку обратно в форму через отладчик, вы все равно можете нажать «Удалить» в качестве стандартного-не-администратора пользователь. Таким образом, бэкэнд должен был бы различать поля администрирования и пользователя, которые были отправлены через http-запрос. – macskay

+0

нет, вы не можете нажать delete как пользователь, не являющийся администратором, потому что ваш метод удаления @Secured только для ROLE_ADMIN..Может быть, вам нужно отделить свои методы DAO для пользователей и администратора и аннотировать Secured соответственно. –

+0

Добавить, у вас будет фильтр безопасности пружины цепочка перехватывает ваш первоначальный запрос HTTP, который управляет сессией пользователя и его ролями, проверяя с помощью некоторого пользовательского db или ldap, чтобы никто не мог нарушать роли текущего пользователя, зарегистрированного в сеансе. –

Смежные вопросы