Я тоже только начал реализовывать свои идеи, наверное уже в несколько изменённом виде.
Права раздаются не на формы (мне это не подходит), а на объекты - получается ACL - хотя никто не запрещает форму считать объектом
Соовественно делаю функции
procedure
Grant(privilege: Tstring; object_id: Tinteger; user_id: Tinteger); - дать право
procedure
Revoke(privilege: Tstring; object_id: Tinteger; user_id: Tinteger); - отнять право
function
CheckGrant(privilege: Tstring; object_id: Tinteger; user_id: Tinteger): Tboolean; - проверить обладет ли пользователь правом
function
GetGrantsOn(object_class: Tstring; object_id: Tinteger; user_id: Tinteger): TGrantsList; - получить список прав которыми обладает пользователь на объекте
Константы я не прописываю, все привелегии храняться в БД:
- Код: Выделить всё
CREATE TABLE privileges
(
-- ID привилегии
privilege_id INT PRIMARY KEY auto_increment,
-- уникальный строковый идентификатор привилегии
privilege_name VARCHAR(80) UNIQUE NOT NULL
);
Например, есть объект класса "project" с ID=1234 и нужно настроить права пользователя с ID=5678
1. нам нужно получить список привелегий для класса "project"
SELECT * FROM privileges WHERE privilege_name LIKE "project:%" (естественно для это будет специальная функция, чтобы каждый раз не писать запрос), получим список прав (или ролей), например,
post_news - разрешение добавлять новости
edit_news - разрешение удалять/редатировать новости проекта.
edit_articles - разрешение добавлять/редатировать статьи.
svn_commit - разрешение на коммит в svn
и т.п.
2. Сформировать табличку в каждой строке чекбокс + название привелегии
3. Админ отмечает глочками нужные привелегии нажимет сохранить
4. В цикле обходим по всем строкам, если галочка отмечена, то вызываем Grant(priv_name, obj_id, user_id), если не отмечена, то вызываем Revoke(priv_name, obj_id, user_id)
Соответственно получается что форма настройки прав будет герироваться автоматически исходя из информации в БД.