2014-05-08 3 views
0

Я работаю с GWT/RequestFactory и набором требований клиентов относительно разрешений. Позвольте мне объяснить основной пример:GWT RequestFactory: проверьте, были ли участники установлены без разрешения

Каждому пользователю присваивается компания. Каждый пользователь должен иметь возможность редактировать основные данные компании, но только, например, контактную информацию, веб-сайт и т. Д. Соответствующие безопасности, такие как BIC/SWIFT, IBAN, название компании и т. Д., Могут быть изменены только в том случае, если у пользователя есть определенное разрешение XY.

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

Моя проблема в том, что я не могу отслеживать изменения на стороне сервера. Наличие @PreAuthorize для каждого сеттера тоже не является опцией, потому что это закончится санкционированием-массовым убийством в каждой сущности.

В настоящее время я следую обходному пути: каждое поле, которое защищено/зависит от данного разрешения, передается как аргумент сущностному методу и исключается из прокси. Таким образом, значения не могут быть установлены с использованием прокси-сервера, и я могу проверить свой код сервера, если у пользователя есть разрешения. Если нет, ничего не происходит. Если у пользователя есть разрешения, я устанавливаю значения вручную. Но это создает множество сигнатур кода и уродливых методов, потому что количество значений, переданных методу, может стать большим.

Надеюсь, вы понимаете мою проблему. Я с нетерпением жду ваших мнений и советов. Заранее спасибо.

ответ

0

Ну, вы можете получить много ответов (разные друг другу), и все они могут быть правы, поэтому в конце ваш звонок. Ждите ответов других. Я собираюсь дать вам подход, которым я следовал (и он работал очень хорошо). : D.

По моему мнению, сервер должен делать как можно меньше, поэтому сохраните логику для разрешения изменения каждого параметра на сервере. Я думаю, что это не масштабируемое решение (, если ваша система имеет 1M пользователей, которые одновременно изменяют все , ваш сервер будет работать свободно?). Я предпочитаю, чтобы клиент выполнял работу (например Roomba: D).

Для решения этой проблемы в нашей системе мы внедрили решение списка контроля доступа. Вы можете хранить в своем db, на каждом объекте пользователя, список с предоставленными разрешениями. Итак, когда эта информация поступает клиенту (например, после входа в систему пользователя), вы можете получить их и показать поля, которые он/она разрешает изменять.

Что-то вроде:

if (canModifyPersonalDetails(user.getAcls(), ...)) { 
    //show labels ... 
} 

if (canModifyBankDetails(user.getAcls(), ...)) { 
    //show labels 
} 

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

Если вы имеете дело с очень скомпрометированной информацией, и вы предпочитаете делать что-то на сервере, в этом случае, возможно, я установил уровень безопасности, когда вы будете продолжать/обновлять свой прокси-сервер, я бы сделал что-то вроде :

if (isAllowForPersonalDetails(user.getSecurityCode()) { 
    //update the modified personal details 
} 

if (isAllowForBankDetails(user.getSecurityCode()) { 
    //update the modified bank details 
} 

user.update(); 

Я большой поклонник понятный пользовательский интерфейс, и очень большой поклонник позволить серверу бесплатно как можно больше, так что я предпочитаю первый вариант. Но если у вас есть ограничения на изменение пользовательского объекта в db, или вы предпочитаете не изменять свои представления или какое-либо ограничение с безопасностью, возможно, второй вариант для вас самый лучший.

Надеюсь, что это поможет!

+0

Спасибо за ваш ответ. Если я правильно понял ваше решение, вы не делаете никаких проверок безопасности на стороне сервера? Моя проблема заключается в том, что я не могу доверять клиентским данным, которые отправляются на сервер (и обычно вы никогда не должны!). Что делать, если запрос подделывается с помощью таких инструментов, как BURP? Поскольку вы отключите/спрятать поля в пользовательском интерфейсе, что не обязательно означает, что они не были отредактированы. Извините, если я ошибаюсь! Привет – grange

+0

Да, это причина, потому что я дал вам второй вариант. В моем случае мои запросы не очень компрометируют, и у меня есть сервлет, который фильтрует все, плюс еще одну проверку безопасности. Итак, насколько я понимаю, безопасность - большой плюс для вас, что вы думаете о микшировании? ЕСЛИ пользователь не имеет доступа к некоторым полям, а не скрывает их отключение, а на сервере обрабатываются отредактированные поля в соответствии с ограничениями безопасности уровня? – apanizo

+0

Это именно то, о чем мой вопрос: RequestFactory устанавливает значения объекта перед тем, как выполняется серверный метод. Таким образом, нет способа решить, имеет ли пользователь разрешения и в зависимости от того, установлены ли эти поля или нет. Единственный способ, которым я знаю, - это обеспечить сеттеры с проверками или, например, весна @PreAuthorize. Таким образом, я получаю исключение, если пользователь не должен изменять значения, но мне нужно было бы защитить каждый сеттер множеством полномочий для обработки всех случаев. И отключение или скрытие полей ui вообще не имеет никакого значения, просто бесполезно защищать от злоупотреблений ... – grange

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