раздача прав на формы

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

раздача прав на формы

Сообщение Attid » 31.08.2008 10:37:22

решил я значит в своей проге раздавать права на формы.

типа в зависимости от того кто зашел может получить только то ему положенно. вот думаю как это дело лучше и проще организовать.

структура программы : запускается главная форма в ней только куча менюшек ~30 из которых вызывается порядка 70 форм

некоторые формы можно вызвать из разных мест, так что просто убирать менюшки наверно не получится, или прийдется их убират в нескольких местах.

какие способы я знаю:

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


2, по названию форм. принцип тотже, только хранятся названия форм аля fmEmployee fmServices
- нужно будет загонять кучу форм даже челу нужен доступ только к "услугам" а там десяток форм
+ легкая автоматизация, проверка прописывается в предке , который просто смотрит если доступ на форму, и так же проверяет доступ на менюхи путем проверки компонент miEmployee miServices
+ можно даже не придумывать описания, просто в форме назначения прав пройти по всем формам проекта и взять их капшены.

может еще какие варианты ? кто что использует ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: раздача прав на формы

Сообщение shade » 31.08.2008 15:49:54

Помоему оба варианта хороши.

У себя на Шамане планирую сделать типа такого (насколько я понял это твой 1-ый вариант):

Таблица Users - пользователи
...

Таблица Roles - роли
role_id - ID роли
role_name - строковый идентификатор роли (например, news_editor)
role_title - удобочитаемое название роли (например, "Модератор новостей")
role_description - описание роли

Таблица Grants - назначения прав доступа
user_id - ID пользователя
role_id - ID роли

И набор API
fucntion grant($role, $user); - дает допуступ пользователю:
INSERT grants (role_id, user_id) ($role[id], $user[id]);

function revoke($role, $user); - забирает права доступа:
DELETE FROM grants WHERE role_id = $role[id] AND user_id = $user[id]

function check_access($role, $user); - проверка доступа:
SELECT * FROM grants WHERE role_id = $role[id] AND user_id = $user[id]

Добавлено спустя 4 минуты 51 секунду:
Смысл в том, что один пользователь может испольнять несколько ролей. А каждая роль подразумевает возможность выполнения определенного набора дейстий и этих действий может быть несколько. Так например для "Модератора новостей" нужно право добавлять, редактировать и удалять новости, что в моей системе три формы. И нет смысла на каждую форму назначать права отдельно.

С другой стороны я думаю, а не возможна ли ситуация, когда одно действие может разрешаться разными ролями? Пока такого случая представить не могу.
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: раздача прав на формы

Сообщение NTFS » 31.08.2008 18:23:42

Есть самописная готовая система безопасности, реализованная в виде библиотеки-dll для вызова процедуры получения прав из главной программы и exe-программы управления базой безопасности (пользователи, пароли, профили, права). Все на fpc и Lazarus, с исходными кодами. Если интересно, пиши на tereshenkov@mail.ru
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: раздача прав на формы

Сообщение Attid » 31.08.2008 19:15:47

NTFS
да код мне реализовать не проблема, ты бы описал каким принципом ты там пользуешься , одним из описанных или что-то третье.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: раздача прав на формы

Сообщение *vmr » 31.08.2008 21:07:06

А чем unix-like ACL не устраивает? Как по мне, так самое то (уже два года успешно юзаем)
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Re: раздача прав на формы

Сообщение Attid » 01.09.2008 09:36:34

*vmr писал(а):А чем unix-like ACL не устраивает? Как по мне, так самое то (уже два года успешно юзаем)

я таких то и букв не знаю. в вике то прочитал что есть ACL только каким боком причесать и чем отличается от первого варианта не понял. можно вкраце как устроенно и как работает ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: раздача прав на формы

Сообщение alexs » 01.09.2008 11:32:10

Я просто держу таблицу прав пользователей вида (№ права, Оператор, Досту). И в программе функция, которая выбирает доступ оператору по номеру права. А уже в нужных местах вызываю эту функцию с ссответсвующим номером для проверки разрешения.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: раздача прав на формы

Сообщение *vmr » 01.09.2008 14:46:03

Attid писал(а):я таких то и букв не знаю

Ээээ, ну это ж основы основ :)

Attid писал(а):в вике то прочитал что есть ACL

В Вике так сумбурно написано... жуть...

Attid писал(а):и чем отличается от первого варианта не понял

Тем что не велосипед :)
ACL - это принцип задания и описания прав доступа

Attid писал(а):можно вкраце как устроенно и как работает ?

Может и не самая хорошая дока, но лучшей пока не нашел:
http://www.suse.de/~agruen/acl/linux-acls/online/



Наверное будет и проще и быстрее сделать второй вариант (я бы с него и начал), но все же теорию почитать стоит :)
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Re: раздача прав на формы

Сообщение Attid » 01.09.2008 15:02:59

*vmr писал(а):но лучшей пока не нашел:

ну своими словами бы описал.


разделения прав на уровне пользователя ОС у меня не пойдет, запущен комп, входит автоматом, запускает мое ПО вместо ДЕ и там в зависимости от логина в ПО будут права. специка такая. нет привязоности к раб месту и пользователям ОС.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: раздача прав на формы

Сообщение *vmr » 01.09.2008 15:26:50

Attid писал(а):разделения прав на уровне пользователя ОС у меня не пойдет, запущен комп, входит автоматом, запускает мое ПО вместо ДЕ и там в зависимости от логина в ПО будут права. специка такая. нет привязоности к раб месту и пользователям ОС.

Права ОС там не при чем. Когда я говорил о unix-like, я говорил о принципе

Кстати у меня вообще выполнено в виде тонкого клиента с жирным сервером на удаленной машине :)

А принцип такой:
Для каждого обьекта, которому необходимо разграничение доступа, создается ACL — список entries.
Каждый entry — всего-навсего является парой субъект - его права . Субъект — это либо юзер, либо группа. Права — это то что субъекту позволено делать с объектом: читать, писать или выполнять (могут быть и другие, но обычно этого достаточно)
Для юниксов есть правило что для каждого ACL существует как минимум три entry: Owner, Group и Others

Т.е. для каждого обьекта ACL задает список пользователей и что им разрешено делать с объектом (читать, писать или выполнять)
Последний раз редактировалось *vmr 01.09.2008 21:54:45, всего редактировалось 1 раз.
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Re: раздача прав на формы

Сообщение Logo » 01.09.2008 21:27:17

Мне кажется, что первый метод предпочтительней. Форма, а также компоненты сверяются, может ли текущий оператор их использовать. Ведь может быть ситуация, что на форме, например, PageControl и для каждого оператора доступны только определенные страницы. Да и с панелями инструментов такая же ситуация.

Наверное не плохо было бы в TComponent добавить свойство ACL. Нужно только обдумать его принцип реализации.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: раздача прав на формы

Сообщение shade » 02.09.2008 00:26:04

*vmr писал(а):Для каждого обьекта, которому необходимо разграничение доступа, создается ACL — список entries.Каждый entry — всего-навсего является парой субъект - его права . Субъект — это либо юзер, либо группа. Права — это то что субъекту позволено делать с объектом: читать, писать или выполнять (могут быть и другие, но обычно этого достаточно)Для юниксов есть правило что для каждого ACL существует как минимум три entry: Owner, Group и Others

Хм.. так и не понял в чем отличие от описанных выше вариантов.

Список, таблица.. какая приниципиальная разница?
Ну преставь, что ACL упаковали в таблицу.
Представь, что объектом права является форма (а не объекты которые она редактирует, т.к. в некоторых задачах этих объектов куча, а раздавать права на каждый объект нет смысла: на кой черт развадать право на каждый отдельно взятый пакет молока?).

Что мы имеем?

У нас есть множество пользователей (операторов) и множество объектов права (в данном случае формы). Между ними нужно установить отношение многие-ко-многим. Т.е. чтобы одному пользователю можно было предоставить права на несколько объектов, и чтобы на каждый объект можно было предоставить право нескольким пользователям. А чем связывать, таблицей-ли, списками-ли, без разницы. Если это приложение БД, то проще связать таблицей, а как обзывать эту связь никакого значения не имеет, хоть ACL, хоть ACT :lol:
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: раздача прав на формы

Сообщение *vmr » 02.09.2008 01:48:20

shade писал(а):Хм.. так и не понял в чем отличие от описанных выше вариантов.

Универсальность ...
... и принцип задания: права назначаются обьекту, а не обьект выбирает права (что обычно захардкожено)
Права — это свойства обьекта, а не наоборот (когда для каждой роли есть жестко прописанные обьекты)

Например твоя функция check_acces требует указания роли для проверки. А это означает что роль ты пишеш прямо в коде: вот эта вот фомочка будет требовать такую роль, а вот та сякую. Это хардкод.
ACL же позволяет кодировать в стиле: "а есть ли у текущего пользователя право на открытие этой формы". Совсем другой подход. Никаких жестко прописанных ролей. Есть только обьект(форма) и субьект(пользователь).

shade писал(а):Представь, что объектом права является форма

Ну и пусть себе является :)
Если проверять на права только форму будет достаточно, то необходимость в дальнейших проверках отпадает (поставил permissions на папку, и все лежащие в ней файлы вдруг, словно сговорились, стали требовать аутентификацию)

shade писал(а):У нас есть множество пользователей (операторов) и множество объектов права (в данном случае формы). Между ними нужно установить отношение многие-ко-многим.

... а еще есть разновидности прав(чтение/запись/etc)...
... и получается многие-ко-дохрена :D

А потом в этой каше еще надо будет разбиратся!
А теперь представь как ты всю это кашу будешь задавать, и чем это будет отличатся от вышеупомянутого ACL'я
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Re: раздача прав на формы

Сообщение shade » 02.09.2008 10:31:46

*vmr писал(а): права назначаются обьекту, а не обьект выбирает права (что обычно захардкожено)Права — это свойства обьекта, а не наоборот (когда для каждой роли есть жестко прописанные обьекты)

Вы не поняли описанной идеи. Грубо говоря, в моем примере, роль - является объектом права. И чтобы дать/забрать право используются методы grant/revoke. "Хадкодом" определяется только список ролей (объектов права) и что, что они позволяют. А то, кому дается право, определяется в рантайме.

Пример. Допустим мы делаем какой-то крупный информационный сайт. Допустим нужно сделать модуль новостей. Нужно предоставить возможность открывать доступ оператором на модерирование новостей (добавление, правка, удаление). Вводиться роль (или специальная группа, если хотите) news_editor, которая дает право модерирования новостей (ведь бессмыслено развать права на каждую отдельно взятую новость). Если пользователь состоит в этой группе, то ему разрешается доступ. В коде, мы можем проверить с помощью check_access, обладает ли пользовать требуемой ролью (состоит ли в этой спец. группе).

Для админа отображается список ролей/групп (название, описание роли, кто обладает ролью). Он выбирает роль и смотрит список пользователей, которые обладают этой ролью. Он может добавлять в этот список пользователей (и они получат право) и удалять (тогда они теряют право). С другой стороны мы можем посмотреть, какими ролями обладает конкретный пользователь: посмотреть/изменить список ролей.

Например, Васе Пупкину, нужно дать право модерировать новости. Админ, находит пользователя, открывает его список ролей и добавляет туда news_editor.

*vmr писал(а):Если проверять на права только форму будет достаточно, то необходимость в дальнейших проверках отпадает (поставил permissions на папку, и все лежащие в ней файлы вдруг, словно сговорились, стали требовать аутентификацию)

Если все данные храняться в файлах, если используются системные аккаунты, то можно и так.
А если наши данные храняться в базе? Если у нас виртуальные пользователи, никак не связанные с системными аккаунтами? Тогда расстановка прав на папки просто не применима.

*vmr писал(а):ACL же позволяет кодировать в стиле: "а есть ли у текущего пользователя право на открытие этой формы".

Ну и в нашем случае тоже стоит точно такой же вопрос:
if check_access(Form1{.RequireRole}, CurrentUser) then ... else ShowMessage('Фиг.');

*vmr писал(а):Например твоя функция check_acces требует указания роли для проверки. А это означает что роль ты пишеш прямо в коде: вот эта вот фомочка будет требовать такую роль, а вот та сякую. Это хардкод.

Для особо ленивых можно например, вместо имени роли использовать имя класса формы:
if check_access(Form1.ClassName, CurrentUser) then ... else ShowMessage('Фиг');
Можно вообще использовать наследование форм, определить класс TSecuredForm, потомком от TForm, определить там пару методов
Код: Выделить всё
procedure TSecuredForm.CheckAccess(User);
begin
  Result := check_access(Self.ClassName, User);
end;

procedure TSecuredForm.RequireAccess(User);
begin
  if not check_access(Self.ClassName, User) then
    raise EAccessDeny.Create('У вас нет права на работу с формой ' + Self.Caption);
end;

function TSecuredForm.Execute: Integer;
begin
  RequireAccess( GetCurrentUser );
  Result := ShowModal;
end;


Но это уже вопросы реализации, которые могут отличаться для разных задач. А приницип один - определить связи между объектами права и субъектами. В случае описываемого вашего подхода, когда данные храняться в файлах и вы разраничиваете доступ настройками ACL, вы просто делегируете эту функцию операционной системе.

Что есть ACL - Access Control List? Фактически список доступа. Для каждого объекта права заводиться список "записей", каждая из которых говорит: "вот такому-то пользователю нужно дать право на такое-то действие над этим объектом". В случае использования ролей, такой список строиться простым запросом:
SELECT * FROM grants, roles, users WHERE grants.role_id = roles.role_id AND grants.user_id = users.user_id
AND roles.name = $roleName;
Этот запрос выдает список записей, который ровно тоже самое: "вот такому-то пользователю нужно дать право на такое-то действие над этим объектом"

Если нужно различать действия (например, read / write), то в таблицу grants можно добавить поле mask, которое будет задавать битовую маску - установлен в 1 - действие разрешается, сброшен в 0 - запрещается.

PS:
1. Если слово "роль" вас смущает, поменяйте его на слово "объект", "группа" и т.п.
2. Хм.. если есть "хардкод", то наверное должен быть и "софткод"...
Осюда вопросы: чем отличается хардкод, от софткода? чем мерять твердость кода? Эта мера непрерываная или дискретная? :)
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: раздача прав на формы

Сообщение v-t-l » 02.09.2008 10:45:14

Я тоже планирую использовать раздачу прав. Предполагаю, что непосредственно визуальная раздача прав будет производится в специальном административном режиме, при нажатии определенной комбинации клавиш, нужно определить, что за контрол находится под мышью и показать окошко для настройки ACL. Вот только не помню, как правильно получить локальные (относительно формы) координаты мыши. :oops:
А после писать в базу Control.Owner.Name+'.'+Control.Name и права доступа для определенного пользователя/роли(группы пользователей). Можно нормализовать: Control.Owner.Name+'.'+Control.Name в одну таблицу, права - в связанную, роли/пользователи - в третью.
v-t-l
энтузиаст
 
Сообщения: 734
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31

Рейтинг@Mail.ru