![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Права пользователей в программе [D7, dBase, FoxPro, Paradox]
jiny © (2006-08-04 11:57:00)я создал программу складского учета, которая уже успешно применяется 1 год в одной организации, при этом права пользователей не учел, это большой минус, но тогда все создавалось быстро и некогда было думать о разграничении прав в программе.
Возникла проблема, из-за кривых и пытливых ручек пользователей, а именно : они лезут в журналы, в которые им не нужно открывать, изменяют цены на позиции, которые не в их компетенции и вообще открывают формы которые относятся к компетенции других отделов.
Вопрос следующий :
Какие существую алгоритмы/методы разграничения прав, как в 1С, например, где можно вплоть до каждой формы пользователю разрешить, либо запретить.
На уровне базы данных сделать можно, но только в FireBird, но сама программа крутится под Paradox, даже если доступ распределен на уровне базы данных, то программа все равно даст юзеру открыть определенную форму, где доступ к базе запрещен и это, я считаю немного неправильным. Как сделать так, чтобы данные о правах на определенные объекты (формы, эдиты, кнопки и т.д.) хранились в определенной таблице и как это вообще делается ? Это перед открытием каждой формы мне нужно сверяться с таблицей ролей и разрешений, есть ли разрешение у данной роли открывать эту форму или нет ?
Я представляю себе схему так :
1) создаю роли ;
2) задаю права на роли ;
3) создаю пользователей, где присваиваю им соответствующие роли ;
Каким образом это делается, пока не педставляю, долго искал в интернете примеры подобного, но так и не нашел ничего стоящего, надеюсь вы дадите мне советы, в каком направлении работать. Если будут ссылки - тоже буду признателен
evvcom (2006-08-10 11:37:00) [1]> [54] jiny (09.08.06 13:36)
> и как видится я - вам не конкурент
Фу (облегченно) ... Успокоил. А то уж я весь на измене, а вдруг подсидишь? :)
> можно попросить стуктуру табл.,
Ну к примеру:
create table ADM_STRUCTURE
(
PK NUMBER not null,
PARENT NUMBER,
IDX NUMBER not null,
IDENT VARCHAR2(50),
ALIAS VARCHAR2(60),
LINK NUMBER,
ICON VARCHAR2(32),
SHORTCUT VARCHAR2(16),
NOTES VARCHAR2(100),
ID_WORKER NUMBER,
ID_FILE NUMBER
);
create table ADM_STRUCTURE_LINK
(
ID_ADM_STRUCTURE_LINK NUMBER(12) not null,
ID_OBJECT NUMBER(12),
ID_PERMISSION NUMBER(12),
ID_DBOBJECT NUMBER(12),
ID_USER NUMBER(12),
ID_ROLE NUMBER(12),
ID_ROLE_INCLUDED NUMBER(12),
ID_FILE NUMBER(12),
ID_SEPARATOR NUMBER(12),
FLAG_REVOKE NUMBER(1) default 0 not null
);
Структура почти вся. Есть дополнительные таблицы для хранения различных файлов, работников (чтобы юзера привязать к ФИО), но это уже к безопасности очень косвенно относится. Только тебе эта структура толком не поможет. Ну не сможешь ты на парадоксе (или кажется ты уже на какую-то "нормальную" СУБД согласился?) раскрутить нормально дерево и реализовать такие сложные запросы. А кода у меня процедур, вьюх и пакетов для обработки такой структуры не на одну страницу будет. И трудозатраты на структуру от силы час, а на отлаженный код уже даже не днями считать надо.
Neo Trinitron (2006-08-10 10:10:00) [2]ИМХО на форуме вопросов о реализации целой подсистемы не стоит задавать, на то и есть профессия программиста. Форум подходит скорее для помощи в случае если не получается что-то небольшое, такой себе гвоздик который не удаётся вытащить, из-за чего останавливается разработка всего проэкта. Автор, Вам тут советов понадавали на три проэкта. Вам написать подсистему? Легко! Но нужно договориться об оплате. Удачи.
jiny (2006-08-09 13:36:00) [3]evvcom © (08.08.06 15:26) [49]
> Мы подобные наработки пишем уже больше года. Правда, в этом
> интервале времени не только наработки с правами, но и весь
> функционал. За это я все время получал неплохую заработную
> плату. Как ты думаешь, я имею право поделиться с тобой этими
> наработками?
Я так думаю, мы в разных странах с тобой находимся, и как видится я - вам не конкурент, тем более что не прошу наработку в целом, а только лишь пример того как это реализовано, часть кода и как выполняется, хотя бы частично отрисовка меню и активизация контролов/форм.Если это тайна для остальных, можно мне в деревню по мылу послать ?
> Мы привязываем пункт меню к форме, форму к некоему логическому
> объекту. Все это, а также пользователи, роли, полномочия
> (точнее их допустимые значения - select, update, delete,
> import, export и др.) и многое другое лежит в одной таблице.
> В другой таблице связей повязаны роли с пользователями
> и ролями, роли и/или пользователи с объектами и полномочиями
можно попросить стуктуру табл., хотя бы на e-mail, на всякий пожарный выкладываю сви структуры, получилось 3 табл.
роли
CREATE TABLE USER_ROLES (
ID INTEGER,
ROLE_NAME VARCHAR(20) COLLATE PXW_CYRL,
ROLE_DESC VARCHAR(30) COLLATE PXW_CYRL
);
доступные объекты в программе
CREATE TABLE USER_PERMISSIONS (
ID INTEGER,
NAME_FORM VARCHAR(150) COLLATE PXW_CYRL,
DESC_FORM VARCHAR(150) COLLATE PXW_CYRL,
NAME_TABLE VARCHAR(150) COLLATE PXW_CYRL,
DESC_TABLE VARCHAR(150) COLLATE PXW_CYRL,
NAME_CONTROL VARCHAR(150) COLLATE PXW_CYRL,
DESC_CONTROL VARCHAR(150) COLLATE PXW_CYRL
);
Финальные разрешения для ролей
CREATE TABLE USER_PERMISSIONS_FINAL (
ID INTEGER,
ROLE_NAME VARCHAR(20),
ID_Object INTEGER,
CANOPEN SMALLINT DEFAULT 0,
CANSELECT SMALLINT DEFAULT 0,
CANINSERT SMALLINT DEFAULT 0,
CANUPDATE SMALLINT DEFAULT 0,
CANDELETE SMALLINT DEFAULT 0,
CANGRANT SMALLINT DEFAULT 0
CANIMPORT SMALLINT DEFAULT 0,
CANEXORT SMALLINT DEFAULT 0,
CANPRINT SMALLINT DEFAULT 0
);
ну и табл. users, где идет привязка юзеров к ролям
может кто-то хочет дополнить/сократить структуру таблиц ?
evvcom (2006-08-08 17:22:00) [4]> [52] ANB © (08.08.06 16:56)
> то будет все равно не шустро
Не знаю, может быть. Результат этой функции есть аналог временной таблицы, но без индексов, или полный аналог результата джойна двух реальных таблиц, который естественно уже тоже без индекса. Если джойнить с большой табличкой, то наверняка самым оптимальным окажется HASH JOIN, а ему как известно индексы по барабану, он их не использует.
> если ты сджойнишь большую табличку
А что может быть в этой табличке? У меня сейчас реально джойнится эта функция 4 раза с таблицей-структурой объектов. 1 тыс. записей, конечно, не назовешь большой табличкой, но тем не менее, если количество этих объектов вырастет и до 10 тыс. (что тоже немного, но куда уж больше-то объектов?!), думаю, разницы большой не будет.
> А индексированная времянка - самое оно. Впрочем, я не навязываюсь :)
А нужен он здесь индекс-то? Впрочем, я тоже не спорю :)
ANB (2006-08-08 16:56:00) [5]
> evvcom © (08.08.06 16:52) [51]
Думаю, если ты сджойнишь большую табличку с этой функцией (для подробной фильтрации строк), то будет все равно не шустро. А индексированная времянка - самое оно. Впрочем, я не навязываюсь :)
evvcom (2006-08-08 16:52:00) [6]> [50] ANB © (08.08.06 16:12)
connect by я реализовал во вьюхе для определения к какой группе (ветви) относится запись в таблице. То ли это роль, то ли юзер, то ли меню, то ли форма и т.д. А уж далее таблица линков джойнится многократно с этим селектом, pipelined функция пакета выбирает данные и записывает анализируя их в table of TMyType index by binary_integer; и возвращает хитро обработанные строки запросу.
У меня сейчас, правда, еще не 5 тыс. прав (в смысле ролей?), но 1 тыс. записей в структуре объектов и 3,5 тыс. в таблице связей, тоже всевозможные перекрестные связи реализованы, запрос, возвращая сотню связок объект-полномочие, выполняется за 0,2 сек. Меня пока устраивает, хотя первоначальный вариант я уже переделывал с целью оптимизации скорости выполнения.
ANB (2006-08-08 16:12:00) [7]
> Что мешает добавить в систему полномочие РазрешениеОтдатьТоварВДолгПокупателюКоторыйНеПолностьюРасчиталсяЗаПредыдущиеПост
> авки и привязать его именно к действию на соответствующей
> форме?
Хорошей идеей МВ была сущность "Контрольная точка". Она могла быть в состоянии "Нету", "Есть", "Есть, но под добро начальника", "Возможность давать добро подчиненным". Имея эту инфу можно организовывать сколь угодно сложную логику взаимодействия, в том числе и на уровне хранимок. И опять же по опыту, когда число таких прав накопилось за 5 тысяч и повялось большое количество перекрестных и вложенных привязок, запрос стал немного притормаживать. Никто даже не пытался завязать этот запрос на фильтрацию данных. А в случае плоской временной таблицы - это вполне можно сделать. Кстати, сам оракл в системных вьюхах фильтрует доступ привязкой к правам. А запрос с connect by по линковке особо то не напишешь.
evvcom (2006-08-08 15:26:00) [8]> а есть вообще примеры подобного, может какие то наработки,
> я все приму с благодарностью !
Мы подобные наработки пишем уже больше года. Правда, в этом интервале времени не только наработки с правами, но и весь функционал. За это я все время получал неплохую заработную плату. Как ты думаешь, я имею право поделиться с тобой этими наработками?
> [20] ANB © (04.08.06 15:52)
Я при логине открываю хранимку USER_OBJECTS и держу курсор открытым на протяжении всей работы клиента. никаких дополнительных обращений к серверу, разве что при перелогине.
> [22] Jeer © (04.08.06 16:17)
> назначались права (доступность) на пункты главного меню,
> права на конкретную форму и права на операции на данной
> форме
Мы привязываем пункт меню к форме, форму к некоему логическому объекту. Все это, а также пользователи, роли, полномочия (точнее их допустимые значения - select, update, delete, import, export и др.) и многое другое лежит в одной таблице. В другой таблице связей повязаны роли с пользователями и ролями, роли и/или пользователи с объектами и полномочиями. Благо в оракле реализован древовидный select! Запрос получился довольно сложный, но достаточно шустрый (меньше 0,2 сек, причем подозреваю, что в основном это время тратится на fetch строк с сервера).
> [23] ANB © (04.08.06 18:04)
> что в эту схему бы не уложились
Сомневаюсь. Что мешает добавить в систему полномочие РазрешениеОтдатьТоварВДолгПокупателюКоторыйНеПолностьюРасчиталсяЗаПредыдущиеПост авки и привязать его именно к действию на соответствующей форме?
> Правда к их минусу вся эта защита на клиенте была реализована
Меня по началу пытались тоже уговорить, что не фиг сильно заморачиваться с защитой на сервере, достаточно ее реализовать на клиенте. Я понял, что просто разговоры ничего не докажут и ... сделал по-своему. В общем-то недовольства такой реализацией не было. И если и есть какие дыры (а недавно о них ты вроде и говорил), то дыры эти уже не мои, а Оракла :) У меня если и полезут юзера напрямую к Ораклу, то увидят только те хранимые процедуры, которые им дозволено вызывать и из программы, и увидят только те записи, что и из программы. :o)
> [34] Dok (07.08.06 14:26)
> это смотря как реализованны пользователи.
Надеюсь, мы все говорим о "правильной реализации" в том числе и пользователей.
jiny (2006-08-08 15:14:00) [9]>>Sergey13 © (08.08.06 15:12) [47]
не знаю, но в 1С мне эта фича нравится, может и не надо так углубляться...
Sergey13 (2006-08-08 15:12:00) [10]> [46] jiny (08.08.06 15:07)
> ты имеешь ввиду в блобе ?
Зачем? В иерархической таблице.
> согласен, зато юзеры меньше проблем будут создавать
Думаешь? Я думаю наоборот. Это как с покупкой товара: есть один вид - берешь и идешь в кассу, есть 10 видов одного и того-же - стоишь полчаса и думаешь, что взять. 8-)
jiny (2006-08-08 15:07:00) [11]>>Sergey13 © (08.08.06 14:59) [45]
>>Ну и храни меню в БД - в чем проблема то? Так можно даже, что бы >>
>>юзера сами себе менюшку рисовали.
ты имеешь ввиду в блобе ?
>>ЗЫ: Только лишнее это все ИМХО. Работы добавляет, а функционала нет.
согласен, зато юзеры меньше проблем будут создавать
Sergey13 (2006-08-08 14:59:00) [12]> [43] jiny (08.08.06 14:54)
Ну и храни меню в БД - в чем проблема то? Так можно даже, что бы юзера сами себе менюшку рисовали.
ЗЫ: Только лишнее это все ИМХО. Работы добавляет, а функционала нет.
jiny (2006-08-08 14:58:00) [13]>>Neo Trinitron © (08.08.06 14:50) [42]
Вот насчет этого у меня уже руки чешуться, в принципе Веба тоже нужна на будущее ! (спасибо за мысль), тогда точно на Оракл переходить буду, т.к. говорят что там в плане прав/привилегий ширше можно думать ...:)
jiny (2006-08-08 14:54:00) [14]В принципе я по этому пути и пошел, но в голове зудит одна мысль "как же сделать настройку меню как в 1С" - такую же гибкую ! я предполагаю, что пока будет всего 11 ролей :
СуперАдмин
Админ
Директор
Менеджер по закупу
Менеджер по продажам
Менеджер по сертификации
Гл.бухгалтер
Бухгалтер
Кассир
Аналитик
Контролер
Neo Trinitron (2006-08-08 14:50:00) [15]Значит так, доступ на сервере нужно разграничить по максимуму, на клиенте можно извращаться как угодно. Это уже дело фантазии. А если завтра нужно будет клиента переписать, web приложение забецать, например, то все останутся довольны ибо логика не изменилась. Даже если у них откроется форма с данными которые они не могут даже читать, то данные они всё равно не увидят.
Sergey13 (2006-08-08 14:47:00) [16]> [38] jiny (08.08.06 14:35)
Можно, кстати, еще проще поступить. Проанализировать текущую роль юзера и по результату рисовать менюшки/формочки. Не думаю, что этих ролей будет много для одного exe-шника.
jiny (2006-08-08 14:46:00) [17]>>Sergey13 © (08.08.06 14:41) [39]
уговорил, да я то уже начал творить, практически заканчиваю, осталось все обхекты вбить в таб и программе предв. проверку включить,
просто, люблю я на чужие примерчики посмотреть, авось что-нить новое увижу.
Ну ладно, я так думаю сессию можно считать закрытой, но если у кого, есть что сказать по данной теме - всегда буду рад выслушать любые советы,
всем спасибо ! :)
Sergey13 (2006-08-08 14:41:00) [18]> [38] jiny (08.08.06 14:35)
> Вот и я о том же, но многие мне все равно твердят, что переходи
> на другой СБД,
Некоторые при всех проблемах, советуют винду переставлять. Всем таким советам следовать - работать некогда будет. 8-)
> вот так никто примерчика и не дал...неужели никто с этим
> не сталкивался ?!
Какой примерчик то? У тебя в [12] jiny (04.08.06 14:14) все нормально "придумано" (с учетом [17] jiny (04.08.06 15:09) ). Вот и твори.
jiny (2006-08-08 14:35:00) [19]>>Sergey13 © (08.08.06 14:30) [37]
Вот и я о том же, но многие мне все равно твердят, что переходи на другой СБД, как ты и сказал ничего он не даст нового, вот так никто примерчика и не дал...неужели никто с этим не сталкивался ?!
Sergey13 (2006-08-08 14:30:00) [20]> [36] jiny (08.08.06 14:26)
Ничего такого супер-пуперного Оракл в этом плане не даст. И ни один сервак не даст, ИМХО. Не его это дело - менюшки рисовать. Хочешь - сам рисуй это в БД и пиши функционал.