#java #google-app-engine #gwt #smartgwt
#java #google-app-engine #gwt #smartgwt
Вопрос:
У меня есть приложение на базе GWT / SmartGWT, которое развернуто в Google App Engine. Я использую источник данных на основе XML. Этот файл необходим для нормальной работы приложения для всех пользователей. Однако я не хочу, чтобы пользователи, не являющиеся администраторами, могли просматривать или загружать этот файл напрямую, указав его полный путь в адресной строке. Я не могу использовать ограничение безопасности GAE (разрешить доступ только администраторам), как указано ниже, потому что это сделает приложение бесполезным для обычных пользователей.
<security-constraint>
<web-resource-collection>
<url-pattern>ds/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
Итак, есть ли способ запретить пользователям прямой доступ к файлу, но при этом разрешить им использовать его через приложение?
Заранее благодарю.
ОБНОВЛЕНИЕ (3 мая 2011):
У меня есть данные в нескольких XML-файлах, и все данные доступны только для чтения (только get, никаких add / update / delete для этих файлов). У меня есть несколько различных функциональных возможностей на клиенте, которые используют эти данные. В большинстве случаев каждая функциональность имеет отдельный источник данных. В некоторых случаях у меня есть привязка данных с помощью виджетов SmartGWT (например, ListGrid), а в других я просто преобразую данные в объекты и использую объекты на клиенте.
Комментарии:
1. Нужен ли клиенту доступ к файлу XML или только к компонентам на стороне сервера? Если доступ к нему осуществляется только на стороне сервера, он будет недоступен для общего доступа до тех пор, пока вы не укажете статический путь к нему в своем
app.yaml
2. @justin-morgan — да, клиенту необходим доступ к данным. Кстати, я использую GAE для Java. Я пробую предложения Питера и скоро опубликую обновление. Спасибо!
Ответ №1:
Итак, файл должен быть загружен клиентским кодом (javascript), но вы не хотите, чтобы пользователи его видели?
Это невозможно сделать — если данные доступны на клиенте, то к ним можно получить доступ.
Решения следующие:
-
Неправильное решение: предоставлять эти данные через GWT-RPC, вместо этого через загрузку файла. GWT-RPC сложно перепроектировать, поэтому «обычные» конечные пользователи не смогут просто загрузить данные. Однако пользователи с некоторыми знаниями смогут это сделать, поэтому это не решение для защиты конфиденциальных данных.
-
Правильное решение: предоставлять клиенту только те данные, которые необходимы и актуальны для данного пользователя. Используйте GWT-RPC для доступа к этим данным или используйте REST, если у вас есть другие клиенты, отличные от GWT. Не предоставляйте никаких конфиденциальных данных. Это в основном вынуждает вас реализовывать бизнес-логику на сервере, а не на клиенте. Что нужно сделать правильно.
Обновить:
вы все равно должны защитить сервлет:
<security-constraint>
<web-resource-collection>
<url-pattern>/profile/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
Комментарии:
1. Спасибо за ваш ответ. Позвольте мне сделать это шаг за шагом. Следуя вашему совету, на стороне клиента я перешел на использование RestDataSource и установил URL для нового сервлета. Этот сервлет считывает XML-файл и отправляет содержимое файла обратно клиенту. Клиент может работать с ответом без каких-либо дальнейших изменений. Теперь я могу защитить папку, содержащую XML-файл. Это решает часть моей проблемы. Однако, как вы заметили, пользователи с некоторыми знаниями могут просматривать ответ, отправленный обратно с сервера. Поправьте меня, если я пока что что-то неправильно понял. Продолжение в моем следующем комментарии.
2. Пожалуйста, прочитайте обновление, которое я поместил в свой OP. 1. В случаях, когда у меня есть привязка данных к виджетам, я предполагаю, что мне придется отправить все содержимое XML-файла обратно из сервлета, как я описал в моем предыдущем комментарии. Это было бы небезопасно. 2. В случаях, когда мне нужны объекты на стороне клиента, я мог бы проанализировать XML и отправить требуемые объекты обратно клиенту. Пожалуйста, дайте мне знать ваши мысли. Большое спасибо.
3. Да, если вы защитили сервлет, то только аутентифицированные пользователи смогут видеть эти данные. Кроме того, вы могли бы отправить эти данные через GWT-RPC, который сложнее декодировать, чем данные REST.
4. Я подумывал об использовании GWT-RPC для # 2. Но для # 1 я мог бы использовать GWT-RPC и вручную устанавливать возвращаемые объекты в виджетах, но я думаю, что могу потерять некоторые функции (SmartGWT), которые поставляются с привязкой данных. Пожалуйста, поправьте меня, если я чего-то не понимаю. Спасибо за ваш быстрый ответ.