вопрос по проектированию БД
Например, тут недавно обсуждали про хранение пароля к БД в открытом виде в конфиге - такой способ избавляет от этой проблемы.
Если у человека нет каких-то прав в системе, то ему и диалог этого интерфейса незачем показывать.
Табличка user'ов тебе все равно понадобится. ФИО и прочие данные ты где хранить будешь?
ФИО и прочие данные ты где хранить будешь?хе
кстати такие данные в базе есть
завтра на работе гляну где они лежат
наверное еще одна табличка есть
самое противное, что мне с этой базой дальше работать, а переделывать всё это слишком накладно
Иногда предикат безопасности может оказаться настолько сложным, что оптимизатор СУБД не сможет самостоятельно построить оптимальный план выполнения запроса. В таких случаях может потребоваться ручное преобразование выражения предиката в более адекватную форму. Пока что мы будем считать, что оптимизатор идеален, и все выражения будут представлены в наиболее удобном для чтения виде.С случае тех же заказов, при необходимости разделения данных по департаментам компании и сотрудникам у каждого заказа должны быть атрибуты idDepartment и idEmployee. А проверки доступа к тем или иным данным можно осуществлять на клиенте в меню фильтрации, дав выбрать только доступные атрибуты. При больших объемах данных, мне кажется, правильней использовать первый подход из статьи.
При больших объемах данных, мне кажется, правильней использовать первый подход из статьи.Сливать клиенту постоянно большие объёмы данных, а так же при этом постоянно проводить их выборку из базы?
Моя идея в том чтоб дать пользователю в фильтрах на выборку указать только допустимые для него значения. В этом случае на клиент грузится только то что нужно.
Моя идея в том чтоб дать пользователю в фильтрах на выборку указать только допустимые для него значения.А если обманет?
Эти значения в фильтрах - ведь тоже из базы берутся и потом фильтруются под клиента. Где?
Держать логику в базе не так уж и плохо - в них для этого есть средства. На сколько я себе представляю - это из-за php+mysql стало модно всё логику, авторизацию и т.п. на чём-нибудь вроде php делать.
такие БД я обычно делал так: создавал табличку юзеров, табличку объектов, табличку ролей и табличку правА как ты сам контролировать будешь, чтобы пользователь не смог получить лишние данные?
Держать логику в базе не так уж и плохо - в них для этого есть средства.Ага, образца 1970-x годов.
А как ты сам контролировать будешь, чтобы пользователь не смог получить лишние данные?ИМХО, этим должен слой бизнес-логики заниматься.
А если обманет?Хочешь подстраховаться, проверь еще раз перед выполнением sql-запроса. Зачем для каждой строчки вычислять можно ее отобрать или нет, должен быть простой признак.
Эти значения в фильтрах - ведь тоже из базы берутся и потом фильтруются под клиента. Где?
Хочешь подстраховаться, проверь еще раз перед выполнением sql-запроса.А где проверять-то?
Зачем для каждой строчки вычислять можно ее отобрать или нет, должен быть простой признак.А как проверять, если не каждую? Где-то её всё-равно проверять надо. Это скорее из области того где бизнес-логика находится - в БД, на application-сервере или на клиенте.
А где должен находиться этот слой?
Ага, образца 1970-x годов.давно уже вроде на Java можно хранимые процедуры писать
p.s. Я не за логику в базе, просто насколько я понимаю, если нужно сделать решение с security labels, которое будет относительно просто сертифицировать - придётся делать именно так как описал топикстартер (т.е. использовать юзеров БД). Ведь сертифицировать собственную бизнес-логику будет наверняка труднее, чем показать, что ты используешь уже сертифицированные средства СУБД (к примеру, Oracle Label Security)
имел опыт общения с ораклом лет 7 назад
процедуры на яве были одновременно менее удобны и тормознее, чем на pl/sql , то есть наблюдался регресс по сравнению с технологией 70-х
может, с тех пор они сделали лучше, но момент был упущен - ведь как раз в то время и набирали популяность разные пыхыпы
Нормальный оптимизатор выполнит проверку один раз на первом шаге. После чего либо продолжит выполнять запрос, либо выдаст пустую строку.
Твой подход ещё хуже ты зачем-то полностью дублируешь функционал базы данных: там и так есть объекты, пользователи, роли, и права.
А где должен находиться этот слой?На сервере приложений. Он может быть установлен на той же машине, на которой БД крутится.
Клиентское приложение почти никогда не должно лазить в БД напрямую.
Только если пишем простенький клиент-сервер без больших требований к безопасности.
Проверить допустимые параметры наверное можно в процедуре, которая запускает sql-запрос. Разве нет?
Смотря какая проверка будет реализована. Если будет написана вычисляемая функция строки, то как бы полный скан таблицы не получился.
проверки параметров, получится хорошая возможность устроить отказ.
---
...Я работаю антинаучным аферистом...
Не понятно, зачем заново реализовывать существующий в базе функционал.
Авторизацию и констрэинты тоже из БД на сервер приложений переносить?
Не получим ли мы увеличение времени разработки, проблемы с производительностью и снижение безопасности?
Ну если уж напрямую к базе подключиться, то можно много всего навертеть.
> то можно много всего навертеть.
Если авторизация сделана в СУБД, а не в примочке сбоку, то хрен.
---
...Я работаю антинаучным аферистом...
В БД должы быть ключи, индексы и внешние ключи.
Можно еще в БД раздать пользователям простейшие права типа "No access, read only, read+write".
Все остальное (row level security, блокировки и т.п.) уже лучше реализовывать не на SQL и не в БД, а на сервере приложений на любимом языке программирования.
Проверить допустимые параметры наверное можно в процедуре, которая запускает sql-запрос. Разве нет?Можно. А чем это будет отличаться? Логика будет в БД, к процедуре и запросам тоже доступ надо разделять.
Все остальное (row level security, блокировки и т.п.) уже лучше реализовывать не на SQL и не в БД, а на сервере приложений на любимом языке программирования.Блокировки... ну-ну.
Доступ к базе данных может быть не только из одного приложения к тому же.
Оставить комментарий
pitrik2
есть некая системаею будут пользоваться люди, каждый со своим логином/паролем и со своим набором привилегий
такие БД я обычно делал так: создавал табличку юзеров, табличку объектов, табличку ролей и табличку прав
а тут встретил совсем другой подход
вместо таблички юзеров используются юзеры СУБД
вместо таблички объектов - объекты БД: вьюхи, ХП
а вот таблицы ролей и прав - как у меня
для всех вьюх стоит GRANT SELECT TO PUBLIC;
в каждой такой вьюхе в условие выбора добавляется
типа нету прав и тогда SELECT ничего не возвращает
редактирование данных в базе осуществляется через ХП, в начале каждой стоит проверка, что UID имеет соотв. права
а вопрос собственно такой, прав ли я что посчитал того кто это сделал идиотом?