У меня сейчас проблема, я думаю, многие сталкивались с этим раньше, и я хотел бы знать, как вы справились с этим.
Итак, представьте, что в вашем приложении 10 000 пользователей. (у каждого есть свой логин пользователя / pw для администрирования своих вещей).
Представьте себе далее, что у вас есть растущая нормализованная структура SQL-таблиц в бэкэнде с такими таблицами, как: Users, Orders, OrderPositions, Invoices и т. Д.
Итак, чтобы показать / отредактировать / удалить содержимое таблицы, которая не относится к самой пользовательской таблице, у вас, вероятно, будут такие ссылки, чтобы пользователи ypur могли взаимодействовать с приложением.
~/Orders/EditOrder?id=12
~/Orders/ShowOrderPosition?orderId=12&posId=443
Хорошо, а теперь проблема:
Каким образом я могу предотвратить "не сложным" способом, что пользователь A имеет доступ (показать / редактировать / удалить) данные пользователя B.
Пример:
Пользователь B звонит:
~/Orders/ShowOrderPosition?orderId=12&posId=443
это порядок пользователя A, поэтому пользователь B не должен иметь к нему доступа.
Итак, в моем коде мне нужно было бы проверить UserIdentity до или в пределах каждого отдельного SQL-оператора , например:
select * from OrderPosition op, Order o, User u
where op.Id = :orderId
and op.Fk_OrderId = :orderpositionId
and o.Id = :orderId
and o.Fk_User = :userId
Только так я могу убедиться, что данные принадлежат запрашивающему пользователю.
Достижение пользовательской таблицы, конечно, будет намного сложнее, чем глубже пользовательское соединение будет скрыто при нормализации (представьте таблицы, такие как платежи или счета, связанные с таблицей заказов ...)
Вопрос:
Каков ваш подход к решению этой проблемы, учитывая: Низкая сложность, СУХОЙ и производительность
(надеюсь, вы понимаете, о чем я;))