2013-07-10 6 views
1

Я разрабатываю Spring MVC webapp, используя также весеннюю безопасность. Таким образом, каждый аутентифицированный пользователь имеет указанный ROLE.Доступ к свойствам объектов на основе роли пользователя

Основываясь на этом ROLE, пользователь может изменить только подмножество свойств объекта.

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

В качестве простого примера, я что-то вроде этого (администратор может изменять все, пользователь может изменить только value1 и гость не может изменить):

<sec:authorize access="hasRole('ROLE_ADMIN')"> 
    Value1: <input type="text" name="value1" value="${entity.value1}" /> 
    Value2: <input type="text" name="value2" value="${entity.value2}" /> 
</sec:authorize> 
<sec:authorize access="hasRole('ROLE_USER')"> 
    Value1: <input type="text" name="value1" value="${entity.value1}" /> 
    Value2: ${entity.value2} 
    <input type="hidden" name="value2" value="${entity.value2}" /> 
</sec:authorize> 
<sec:authorize access="hasRole('ROLE_GUEST')"> 
    Value1: ${entity.value1} 
    Value2: ${entity.value2} 
    <input type="hidden" name="value1" value="${entity.value1}" /> 
    <input type="hidden" name="value2" value="${entity.value2}" /> 
</sec:authorize> 

Какие альтернативные подходы можно предпринять для того, чтобы держать вещи, как как можно проще?

Спасибо Marco

+0

Вы можете показать примеры пару? –

+0

Я добавил простой пример кода – gipinani

+0

Как комментарий - обратите внимание, что вам также нужно дважды проверить, были ли изменены только разрешенные поля в бэкэнде, иначе злонамеренный пользователь может подделать запрос формы POST и добавить поля, которые изначально не отображались в форма. –

ответ

0

Один из способов заключается в использовании hasAnyRole([role1,role2]), чтобы проверить список роли .Затем ваши коды станут:

<sec:authorize access="hasAnyRole('ROLE_ADMIN' , 'ROLE_USER')"> 
     Value1: <input type="text" name="value1" value="${entity.value1}" /> 
    </sec:authorize> 

    <sec:authorize access="hasRole('ROLE_GUEST')"> 
     Value1: ${entity.value1} 
     <input type="hidden" name="value1" value="${entity.value1}" /> 
    </sec:authorize> 

    <sec:authorize access="hasRole('ROLE_ADMIN')"> 
     Value2: <input type="text" name="value2" value="${entity.value2}" /> 
    </sec:authorize> 
    <sec:authorize access="hasAnyRole('ROLE_USER' , 'ROLE_GUEST')"> 
     Value2: ${entity.value2} 
     <input type="hidden" name="value2" value="${entity.value2}" /> 
    </sec:authorize> 
+0

благодарю вас за ответ. Я знаю, что существует такая функция, но она по-прежнему не меняет способ выполнения задания, то есть с помощью скрытого типа ввода. Я ищу еще одну идею, чтобы избежать использования скрытого типа ввода и выражения проверки в представлении. Кроме того, чтобы избежать проблемы, описанной Kresimir Nasek в предыдущем комментарии: помните, что вам также нужно дважды проверить, были ли изменены только разрешенные поля в бэкэнде тоже, в противном случае злонамеренный пользователь может подделать запрос POST формы и добавить поля, которые изначально не отображались в форме – gipinani