2012-05-09 3 views
0

Я использую многопользовательское веб-приложение SaaS в Java, Spring, Struts2 и Hibernate. После небольшого исследования я решил реализовать многопользовательский режим в общей схеме совместного использования, общей схеме, общей таблице. И пометка каждой db-линии с помощью tenantId.Защита приложения SaaS Multi Tenant

Я переписал свое приложение, поэтому Менеджеры и Дао возьмут tenantId в качестве параметра, чтобы обслуживать только правильные db-ресурсы.

Это идеальное решение для всех видов при получении информации. А также для создания нового материала (с помощью зарегистрированных пользователей tenantId для хранения информации).

Однако для обновления и удаления материалов я не уверен, как защитить мое приложение. Например: когда пользователь хочет отредактировать объект, url будет: /edit?objectId=x И это отображается в действие, которое будет извлекать этот объект по идентификатору. Значение любого зарегистрированного пользователя может с помощью url-модификации просматривать любой объект. Это я могу решить, добавив tenantId к Dao, поэтому, если Пользователь пытается просмотреть объект за пределами своей аренды, он ничего не получит.

Хорошо, тогда нормально, но о том, когда вы отправляете в форме редактирования? Что делать, если пользователь изменяет запрос, возится со скрытым полем objectId, чтобы действие получило запрос на изменение объекта, не принадлежащего арендатору пользователей.

Или, если пользователям URL-модифицирует действие Удалять /delete?objectId=x

Основном мне нужен какой-то способ гарантировать, что зарегистрированный пользователь имеет доступ к все, что он пытается сделать. Для всех это легко. Просто поставьте tenantId в предложение where. Но для обновлений и удалений я не уверен, в каком направлении идти.

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

У кого-нибудь есть подсказки или советы по моим вопросам?

ответ

0

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

В этом случае вы не хотите сначала выполнять производительность запроса, а затем обновление. Это нормально, поскольку вы можете обновить базу данных с помощью условий. Поскольку в вашем случае это, вероятно, будет уровень базы данных, вам нужно знать, на что способна ваша база данных (сделать это за один раз). Например, oracle имеет оператор слияния.

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