powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
25 сообщений из 35, страница 1 из 2
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32738545
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С ростом числа пользователей и усложнения системы раздачи прав я все больше склоняюсь к мысли, что права пользователей на объекты надо хранить в расчитанном виде. Ну или в предрасчитанном, если будет угодно. Попробую пояснить. Есть база пользователей. Скажем так, пока до 1000 , но уже больше 100. Есть объекты, типов которых с десяток. Есть права на объекты. Права разные для объектов разных типов, но прав до десятка на каждый тип объекта. Просто некоторые права для некоторых типов объектов (пока) не востребованы. До сих пор каждое обращение к объекту происходит через перерасчет прав пользователя на этот объект.
Да! Оч важен факт, что сама система прав достаточно сложная, с возможностью делать исключения. Типа можно читать все каталоги диска кроме каталогов, начинающихся на 'S%' ну или в этом духе. То есть агрегация в правах УЖЕ присутствует.
Система раздачи (и хранения розданных прав) по возможности упрощена в целях хоть как-то в этом безобразии разобраться. Естественно, ролевая модель, то есть есть роли, права даются им, а для пользователя права ролей суммируются. Вопрос не в этом, все это описание приведено только для понимания сути проиисходящего и носит сугубо приблизительный характер.
Вопрос в том, а не хранить ли уже готовые права в отдельных таблицах? Точечные запросы, конечно, много не едят, но их очень много. И когда их очень много, то даже 16 ms на запрос уже чуствительно. Но как только мы начинаем хранить уже расчитанные права пользователей на объекты в виде Ид пользователя + Тип объекта + Ид объекта + Ид права + Состосние права (или в немного денормализованном виде, по таблице на объект, Ид объекта, Ид пользователя, Право1, Право2, Право3 и т.д.) так сразу возникает вопрос - а что с этим великолепием делать при изменении, пусть несущественном, прав? Пересчет, по предварительным прикидкам, стоит недешево. Более того, одномоментный пересчет прав для всех пользователей для всех объектов стоит ОЧЕНЬ дорого! Из-за того, что при миллионе объектов и 1000 пользователей и 10 правах это будет... Ага! Именно столько! А объектов больше! Конечно, далеко не все пользователи имеют права на все объекты. И степень перекрытия прав невелика. Но это не уменьшает проблему.
Есть у кого-то опыт работы в этом направлении? Речь, естественно, может идти не о правах на объекты, а о любом сложнорасчитываемом, но постоянновостребованном функционале.

Спасибо, если дочитали :)

P.S.Сейчас способ расчета и хранения + набор флагов актуальности применяется частично и на небольшом наборе прав для пользователя (менее 10% объектов доступно) оправдывает себя - цена перерасчета относительно невелика, а сам перерасчет делается только по одному пользователю по факту обращения пользователя за информацией. Если инфа на момент обращения актуальна, то запрос выполняется сразу. Если неактуальна, то пользователь ждет, пока для него актуализируется инфа по доступу.
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32738672
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Права разные для объектов разных типов, но прав до десятка на каждый тип
> объекта.

Поясните, пожалуйста, для какой цели?

> Вопрос в том, а не хранить ли уже готовые права в отдельных таблицах?

Если я правильно разобрался в написанном, member Crimean, то предложил бы такое решение: используйте стандартную схему security (т. е., ограничение доступа на уровне бд, объектов бд и интерфейса). Причем, ограничение доступа к объектам бд можно сделать комбинированным (т. е., используя ACL, что Вы и предлагаете, но держать в ACL только исключения, - таблица будет небольшой), если объекты бд у Вас описаны достаточно полно в самой бд. Унифицируйте права. Вынесите избыточную часть в интерфейсные ограничения.
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32738827
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос был - считать или хранить. По мере усложнения (больше логики) и утяжеления (больше пользователей) системы доступа. Если хранить, то когда и как пересчитывать.
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32738972
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку права предоставляются каким-либо ответственным лицом (админом), то можно хранить готовые права отдельно (ИМХО). Админ может подождать или заняться чем другим. Например - выпить рюмочку кофе
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32739091
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Вопрос был - считать или хранить.

Неправильно заданный вопрос. В любом случае признаки сущности (коллекции, объекта, элемента, атрибута или как там у Вас сделано) где-то хранятся. И в любом случае они сравниваются с правами пользователя.

Вам нужно радикально менять и и схему хранения признаков, и схему сравнения.
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32739166
Vredina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конечно извините за флуд, но раз у нас в гостях guest_xxxx, то некий анализ его участия в форумах предполагает, что у всех неправильно и все надо менять.
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32739230
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Права на изменение/удаление/добавление - элементарно решаются при помощи триггеров before
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32739436
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> что у всех неправильно и все надо менять.

Хм... guest Vredina, дружище, скажите честно, Вам нравится решение, которое предложил member Crimean? По существу есть что возразить? Что обсуждаем? Мою скромную персону или все-таки ограничение доступа? Если мою персону, - буду грубить. Невзирая на лица. Если ограничение доступа - пожалуйста, имейте уважение к оппонентам и выражайте свои мысли более содержательно. Если их есть, конечно.

По существу: в рунете видел пару-тройку статей по ограничению доступа в dbms, - ни одна из них не удовлетворила. Механизм ограничения доступа используется, например, операционными системами, в одних - на основе ACL, в других - на основе идиом владельцев и прав (пусть будет rwe, не помню, как он в оригинале называется). Более гибким видится комбинированный подход, который достаточно просто реализуется в реляционной dbms. Естественно, имеет право на жизнь реализация любого - ACL или rwe - механизма отдельно. У каждого есть свои минусы.

Скомбинировав эти два метода, можно дополнить их парой примитивов и получить нормальное решение промышленного качества.

> Права на изменение/удаление/добавление - элементарно решаются при помощи триггеров before

Если набор прав больше, чем изменение/удаление/добавление?
Если dbms триггеры не поддерживает?
Если нужны ограничения на уровне интерфейса?
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32739910
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 cremian
А у Вас права только на элементы интерфейса или ещё на объекты СУБД средствами СУБД ?
ИМХО , если хорошо налажены права на интерфейс, то можно не изощряться правами в СУБД , т.е. сделать их упрощенно.
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32742833
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз.
Система раздачи / хранения / ... прав не обсуждается. Не в ней дело. В любой системе наступит время, когда пользователей станет очень много. Если пользователей много, то расчет списка доступных объектов для каждого пользователя станет недопустимо накладным.
Например, 1000 объектов (фигня, правда ведь!) для 10 пользователей даст в худшем случае до 10 000 записей. А вот та же 1000 объектов для 1000 пользователей даст до 1000 000 записей. А если прав больше (порядка 10)? Уже чуствительно! А если объектов не 1000 , а миллионы?..
Пусть я упростил метод расчета доступности объекта. Но это все равно будет расчет. И в моменты массированного доступа у меня будет завал по производительности - все сожрет расчет доступов. Не думаю, что кто-то будет спорить с тем, что доступ к данным происходит на порядки чаще, чем изменение прав. Суть предложения сводилась к таки расчету списка доступных объектов, но вот когда это делать?
А если делать это только для одного пользователя (в один момент времени) и только в момент доступа самого этого пользователя к данным и то только после изменения прав этого пользователя? А все изменения прав и добавления объектов просто должны инвалидировать признак актуальности прав пользователей, кого это коснулось или всех - это уже дело десятое. Важен принцип, который, вроде как, можно выстроить на соотношении числа обращений за данными и числа обращений за изменением прав.
В итоге чем реже будут меняться права, тем больше будет выигрышь. А ждать будет не админ, меняя права, а пользователь, обращаясь к данным. И количество пользователей тут на время ожидания не влияет. Сейчас, конечно, мне скажут, что после глобального изменения прав как только все ломанутся за своими данными, так сразу все и подохнет. Ну да. Это есть. Это второй вопрос - что делать в таком случае :) Можно, конечно, запустить потихоньку систему считать права для тех, кто чаще доступается...
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32742928
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Если пользователей много, то расчет списка доступных объектов для каждого
> пользователя станет недопустимо накладным.

ACL - это не единственно возможный способ ограничения доступа. Вы вообще читаете то, что Вам пишут?
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32742929
Один
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забавно, буквально только что закончил подобную задачу...
Честно говоря, "волшебного решения" нет.

У нас в системе (количество пользователей до сотни) система прав тоже достаточно развитая, тоже с возможностью исключений.
Так вот.
Права вначале расчитывались "на лету". Затем это стало сильно подтормаживать. Решили хранить их расчитанными.
Быстро выяснилось, что да, скорость возрасла (естественно), но вот написание триггеров (у нас так), которые рулили генерацией прав, и их тестирование - та еще задача. Но это дело такое, один раз написал и все. Таблица прав выросла до чудовищных размеров, появились те проблемы, о которых вы написали (а именно стоимость раздачи прав).
В результате напряглись умом и переделали сам принцип раздачи прав и вернулись к первому состоянию "расчет на лету". Пока устраивает.

Но думается мне, что через какое-то время придется часть расчетов прав хранить. Но не полностью расчитанные, а именно "в предрасчитанном" виде.

Так что мой совет такой. Как всегда, истина посередине. Т.е. в качестве компромисса хранить предрасчитанные права. Если это возможно конечно.
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32742930
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начнем с политики безопасности. Она может быть либо закрытой - либо открытой.

Закрытая - запрещено все что не разрешено.
Открытая - разрешено все что не запрещено.


У каждого объекта есть создатель объекта (хозяин) + Каждый объект можно назначить в группу. А в эту же группу может входить лицо, права которого мы должны определить. (Не забываем про суперпользователя)

Ну отсюда и пляшите.
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32742939
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CrimeanСпасибо, если дочитали :)
Есть еще один вариант - рассчитывать права при старте сессии. Так убиваются два зайца: во-первых, снимается нагрузка, а во-вторых, обеспечивается модель "сессия идет с начала до конца при единых правах" - что можно со всеми основаниями назвать фичой, а не багой :)
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32742947
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, что-то я не точно понял, как применяются права сейчас :)
Но может - если так и так долго - заранее рассчитывать то, что потом долго, и оставлять нерассчитанным то, чего потом быстро, или чего вообще нельзя рассчитать.

У нас вот нет прав на конкретные строки, объекты среди списка таких же. поэтому проще все: права на выполнение действий конкретно в БД - т.е. прва на запуск ХП. И права на интерфейсные объекты. Естественно права в БД грантуются после их изменения. Ну а права на интерфейс рассчитываются при запуске и при открытии конкретной формы.
Как бы делали, если бы нужны были права на доступ к конкретным объектам - фиг его знает. Пока не надо - не думал.

-- Tygra's --
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32743031
Фотография UK0IAI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неплохой вариант - при старте сессии заполнять временные таблицы. при этом можно получить разную "мощность". Например, в табло's при старте заносятся реестрыы "узлов" (группы объектов). Или полные (конечные) списки объектов. Такие табло's можно иметь много. Или всего одно.

В общем случае - система может сама разбираться - что ей "подсунули" - группы объектов или ALL.

например, я так и поступил - при старте парсится дерево описания всех прав на все и про все (в своей части). Результат - в табло. Там все видно, что юзер ....обладает списками ...ролей, армов, бизнес-функций... и + конечные списки групп объектов_разделения_доступа_уровня_строки_БД (например, группы клиентов, товаров...)

Далее следует гибрид Закрытой/открытой политики. Например, в приложении - можно сразу предусмотреть популярную комбинацию - на уровне его кода.
Например - в интерфейсах (когда видимость любого айтема можно изменить через его описание...) - можно сразу , успешно закодировать дефолтную...

понятно, что для разных "мощностей" уместна своя стратегия. истина лежит где то по-середине.
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32743034
Один
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще забыл написать.
Большой проблемой при хранении расчитанных прав является также и раздача прав не только при добавлении нового пользователя или перемещении его между группами (это в конце концов происходит не так уж часто), но и при добавлении объекта или какой-либо операции с объектов в результате которой с правами надо что-то сделать. Вот это действительно печально, потому что
а) дорого
б) происходит часто
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32743154
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> неплохой вариант - при старте сессии заполнять временные таблицы. при этом
> можно получить разную "мощность"

Уважаемый дон не в Датаарте часом работал? - почерк похож.

2all: это сбор любителей геморроя? Возьмите любую нормальную операционную систему - там есть ограничение доступа? А геморрой с правами? А где там расчеты? Где "до десятка прав"? Н-да...
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32743205
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще - самая геморройная часть прав - это права на селект. На insert/update/delete как-то попроще... а вот на селект, когда кто-то должен видеть лишь часть таблицы.. или часть полей.. - это да... тяжко. На все случаи жизни вьюшек не насоздаешь. Да и если применять USER во вьюшках... хм.. не всегда все так тривиально выглядит как хотелось бы. Везде своя изюминка, в каждой системе.
Лично я для таких систем никогда не использовал GRANT. Хотя DB2 - это уже отдельная история...
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32743344
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Речь не только о правах на SELECT, хотя и о них тоже.

Насчет операционной системы господин guest_20040621 лукавит.
В операционках нет раздачи прав на файлы, содержащие слово "вася" с 5 по 10 позицию... А у нас - есть :( Ну и мне сложно себе представить операциоку с парой десятков миллионов файлов в одном (!) каталоге со сложной нарезкой прав на них при наличии 1000+ конкурентных пользователей, щарящих в этом каталоге. При этом регулярно требуется перерезать права...

Насчет компромиссов - да, есть три категории пользователей. Для одной установлен признак "суперпользователь" и все доступно без проверок / расчетов. Для второй категории права считаются при каждом доступе. Для третьей категории формируется что-то типа того же ACL. При добавлении нового объекта он прописывается всем пользователям, кому доступен и для кого доступ актуален. При измении прав сбрасывается флаг актуальности для тех пользователей, для которых права хранятся и для которых списки доступа все еще актуальны...

Но это все для объектов, которые "редко" добавляются. Для объектов, которые часто добавляются права только считаются... Ну и поскольку объекты часто добавляются, то для них ничего (в смысле прав) не хранится... Но считать чем дальше, тем накладнее...
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32743397
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> вообще - самая геморройная часть прав - это права на селект. На
> insert/update/delete как-то попроще... а вот на селект, когда кто-то должен
> видеть лишь часть таблицы.. или часть полей.. - это да... тяжко.

Эта задача имеет абсолютно беспроблемное решение. И не одно.

> Насчет операционной системы господин guest_20040621 лукавит.

Да ну? Очень интересно. Где именно?

> В операционках нет раздачи прав на файлы, содержащие слово "вася" с 5 по 10
> позицию... А у нас - есть :(

Любой системный администратор напишет такой скрипт за пару минут и будет автоматом запускать его с нужной периодичностью.

Хотя даже теоретически не могу себе представить ситуацию, когда это было бы нужно. В принципе.

Кто сие чудо проектировал? Можно взглянуть на исходное задание?

> Ну и мне сложно себе представить операциоку с парой десятков миллионов
> файлов в одном (!) каталоге со сложной нарезкой прав на них при наличии 1000+
> конкурентных пользователей, щарящих в этом каталоге.

Да какая разница, сколько файлов, - лишь бы ОС такое количество поддерживала. Откуда требование одного каталога? Какие сложные права? Откуда они взялись?

> При этом регулярно требуется перерезать права...

Что значит "перерезать"? Х. з., это я тупой или Вы набором букв разговариваете?
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32747335
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И сколько будет работать такой скрипт на лимоне файлов и тыще юзеров?
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32747366
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> И сколько будет работать такой скрипт на лимоне файлов и тыще юзеров?

Понятия не имею. Пишите, запускайте, считайте, если интересно. Вопрос был в том, что это возможно, а не в том, что это рабочее решение.

Похоже, конструктива от Вас не добиться. Хм... жаль. С другой стороны - каждый сам себе злобный буратино.

Вот что меня всегда жутко расстраивает - так это когда кривизну собственных решений тщательно маскируют. Проблема не в Вашем проекте, member Crimean (ну, сделали и сделали, работает - и очень хорошо, не надо его трогать, проще пару серверов докупить, если притормаживает (дешевле, чем переписывать и оптимизировать)), а в том, что прочтет это обсуждение разработчик (а еще хуже - студент) и решит: "Вау, если так сделано продакшн приложение, и я так же сделаю". Тиражирование ошибок гораздо хуже самих ошибок.
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32748098
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема, скорее всего, в том, что у объекта есть несколько ключевых реквизитов и права необходимо раздавать в разрезе всех этих реквизитов.
Или, другими словами, объект типизован несколькими классификаторами. Права пользователям на объект могут быть назначены в разрезе любого или в разрезе нескольких классификаторов. Это, возможно, неправильно, но так надо заказчику. И что с этим делать?
...
Рейтинг: 0 / 0
Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
    #32748505
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Проблема, скорее всего, в том, что у объекта есть несколько ключевых
> реквизитов и права необходимо раздавать в разрезе всех этих реквизитов.

Imho разумный подход.

Вы говорили, что сейчас используется суммирование? - т. е., если я правильно понял, каждый атрибут имеет маску прав и результирующие права - "логическое или" (или какая у Вас политика?) прав каждого атрибута.

Т. е., как регистрировать права вроде понятно. Imho все-таки правильнее права формализовать, т. е., использовать их одинаковый набор для любого объекта; возможно, для части объектов их полный набор не будет иметь смысла, но если приложение может различать типы объектов, это не так важно.

С изменениями прав: по-видимому, пересматривать нужно права тех объектов, атрибуты которых изменились? Хуже, если при этом нужно менять права всех связанных объектов: придется описывать объекты базы данных, связи и строить для них зависимости изменений. Если есть понятия процессов, маркируем измененный объект и указываем идентификатор зависимости.

Вариант уменьшения нагрузки на приложение: разделите понятия "тип доступа" и "права доступа". Если не всем пользователям нужен режим изменений, заведите маркер (или, если режимов доступа планируется несколько, - таблицу) и проверяйте права только если флаг установлен (или выбрано определенное значение). Права объекта (как признак объекта) можно (imho и нужно) хранить в явном виде, - быстрее. Не все очевидно со сложными объектами: для корректной установки прав (или изменения) потребуются дополнительные проверки. Информацию о владельцах объектов можно (imho и нужно) хранить в явном виде. Множественный доступ может быть организован либо группировкой владельцев (группы, роли или и то и другое) и хранением идентификатора в явном виде опять же как признака объекта, либо наследованием (сложнее проверять, неочевидна логика, но компактнее хранить).

Группы предпочтительнее для дополнения политики доступа возможностью оперировать объектами только своей группы.

Изменения журналируются.

ACL можно использовать для хранения исключений.

> Или, другими словами, объект типизован несколькими классификаторами.

Не в тему: классификаторы как организованы (разнесены на логическом или физическом уровне)?

P.S. Основная проблема в том, что накладно хранить достаточно большое количество дополнительных признаков объектов, но при текущей стоимости HDD и памяти - как-то и говорить об этом не хочется.
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Решение проблемы разделения доступа. Расчет в реалтайме или отложеный?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]