Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Вниз

Доступ к документам   Найти похожие ветки 

 
kaif   (2003-12-08 16:39) [0]

Встраиваю в свою конфигурируемую систему Allegro разграничение привилегий доступа.
Система такая: имеется основной навигатор - "Проводник по документам", в котором пользователи могут создавать папки. Все документы находятся в каких-то папках, наподобие того, как это происходит в ОС.
Хочу сделать так, чтобы юзер, создавший папку (владелец) мог назначить на нее привилегии доступа обычным юзерам или ролям.
Хочу сделать 4 уровня доступа:
0. Unvisible (папка не видна, документы и папки в ней какой-то юзер видеть не может)
1. Visible (папка видна, видно ее содержимое - список документов и папок, но вызвать никакой документ для просмотра невозможно)
2. ReadOnly (документы в папке доступны для вызова в режиме просмотра)
3. All (все права: редактировать, удалять, создавать документы в папке, создавать новые папки в ней, перемещать документы в другие папки, имеющие доступ All)
------------
По умолчанию после создания папки права All для юзера PUBLIC. То есть полный доступ для всех. Затем владелец папки может отозвать права у PUBLIC и назначить конкретные уровени доступа каким-то юзерам или ролям.
Права наследуются вложенными папками.
------------
Это не защита на уровне сервера. Эта защита реализуется на уровне интерфейса. В 90% случаев этого достаточно.
Возможно в будущем защита будет усилена средствами сервера.
------------
Администратор SYSDBA может поменять владельца любой папки. И вообще имеет все привилегии, как обычно, в частности привилегию назначать привилегии на папки.
------------
Привилегии на папки предоставляются без Grant option. То есть владелец папки не может делегировать право администрирования папки кому-либо.
------------

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


 
Sandman25   (2003-12-08 17:01) [1]

Вспоминаю свою дипломную работу... :)
Зачем пользователю что-то показывать, если он все равно не сможет даже посмотреть содержимое?

У нас (диплом делали 1 на двоих) доступ настраивался для документов и папок отдельно. В папку можно:
1) зайти
2) добавить документ
3) редактировать папку, то есть удалять из нее документы (если есть соответсвующий доступ на документ). При перемещении/копировании доступного документа в папку без доступа на редактирование пользователь не сможет редактировать/удалять документ, даже если у него есть доступ к документу.
Этот же доступ необходим для удаления папки.

Доступ 3 включает в себя доступ 1 и 2, доступ 2 включает в себя доступ 1. Получается, что для каждой операции можно проверять, чтобы уровень доступа пользователя был не ниже некотого значения.

Документ можно:
1) смотреть
2) редактировать
Естественно, пункт 2 включает в себя пункт 1.

Может, потом еще что вспомню. Все-таки, давно это было.


 
Sandman25   (2003-12-08 17:04) [2]

Вспомнил. Доступ "добавить документ в папку" разрешал добавлять и папки.
Кстати, с таким подходом не будет ситуации, когда после перемещения документа, никто не сможет его посмотреть - перемещение в недоступную папку невозможно, папка просто не видна.


 
kaif   (2003-12-08 17:27) [3]

2 Sandman25 © (08.12.03 17:04) [2]
То есть правильно продумать все так, чтобы доступ к чему-то не потерялся "случайно".
Возникает такой вопрос. Достаточно ли управлять доступом к документам на уровне папок? А доступом к документам как таковым уже не управлять. Если документ в ходит в папку, недоступную данному юзеру, то и документ недоступен ни при каких условиях (при альтернативном поиске и т.д.). То есть папка и управляет доступом ко всем документам в ней. Не нравится - создавай отдельную папку.


 
Sandman25   (2003-12-08 17:50) [4]

[3] kaif © (08.12.03 17:27)

Наверное, можно придумать такую систему папок. То есть если папка доступна пользователям 1, 2 и 3, то условно назвать ее 1_2_3. Если доступна пользователям 1,2 и 4, то назвать ее 1_2_4. Но тогда есть 2 проблемы: во-первых, теряется роль папок в качестве объединения предметной области. То есть вместо папки Напитки, а в ней папок Водка и Пиво придется писать что-то гораздо более сложное и непонятное ("Водка, доступная всем", "Водка, доступная 1 и 2" и т.д.) А во-вторых, слишком много будет папок и слишком сложно ими управлять.


 
kaif   (2003-12-08 18:12) [5]

2 Sandman25 © (08.12.03 17:50) [4]
Аргумент интересный. Я подумаю. Но у меня на практике папки в проводнике оказываются просто распределенными по менеджерам (точнее, темам), например:

Заказы
Самара
Новосибирск
Красноярск
Омск
Инвойсы
ZZZ inc
AAA & BBB
Поставки
Склады и магазины
Склад1
Склад2
Склад3
Финансовые операции

Скажем, заказы каких-то регионов ведет один менеджер, заказы других - другой. А тот, кто занят финансами - имеет доступ ко всем папкам. Такого не бывает, чтобы среди всех документов Самары потребовалось на какой-то из них устроить отдельное администрирование доступа. На данный момент вообще доступ не администрируется и пока никто не путался...

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


 
Sandman25   (2003-12-08 18:24) [6]

[5] kaif © (08.12.03 18:12)

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


 
kaif   (2003-12-08 18:44) [7]

2 Sandman25 © (08.12.03 18:24) [6]
Меня пожалуй сильно заботит реализация. Я намерен иметь таблицу, в которой будут храниться привилегии на папки:
DOC_DIR_PRIVILEGES(
DIR_ID INTEGER,
PRIVILEGE_TYPE INTEGER DEFAULT 3, /*value in 0..3*/
USER_NAME CHAR(31) DEFAULT "PUBLIC")

Меня волнует наследование. Я могу сделать так, что каждая папка имеет хоть одну строку в этой таблице и поэтому эту таблицу можно объединить с таблицей папок по полю DIR_ID и условию
(USER_NAME = USER) OR (USER_NAME = ROLE) OR (USER_NAME = "PUBLIC")
а можно сделать так, что записей в этой таблице почти нет (кроме созданных явно в какой-то момент), а при выяснении прав каждый раз срабатывают хранимые процедуры, анализирующие все привилегии по родительским папкам на предмет минимальной привилегии.

В первом подходе мне придется тут же рекурсивно поддерживать соответствие правил доступа всех вложенных папок, если юзер меняет привилегии на данную папку. Мне кажется этот подход более быстрым, так как этот механизм реализации наследования срабатывает 1 раз и после этого простыми SQL-запросами можно быстро получать все привилегии на все папки без всяких "обходов дерева". Но при этом правда число записей в таблице DOC_DIR_PRIVILEGES будет немаленьким.

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

Если Вы согласны с моим подходом, меня это вдохновит на такую реализацию.


 
Sandman25   (2003-12-08 18:57) [8]

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


 
Sandman25   (2003-12-08 19:01) [9]

Пришла мысль, может и пригодится Вам.
Если нужно, админ может временно закрывать папки от доступа, не меняя доступа пользователей к папке после снятия запрета. Нужно записывать id папки в спец. таблицу и в запросах проверять and not exists (select * from spec_table where folder_id = ). Таким же образом можно осуществлять "транзакции", закрывая доступ к папкам при осуществленнии каких-то важных, но длительных операций.
Все, я ушел. Желаю успехов!


 
kaif   (2003-12-08 19:02) [10]

2 Sandman25 © (08.12.03 19:01) [9]
Спасибо за участие!



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
7-12174
genek84
2003-10-24 12:49
2004.01.05
как отловить подключение дисков c помощью хуков


14-12128
Phn
2003-12-13 16:51
2004.01.05
Увеличить скорость работы процедуры


14-12042
Юрий Зотов
2003-12-07 21:49
2004.01.05
---|Ветка была без названия|---


3-11785
www
2003-12-09 13:40
2004.01.05
TQuery design time и run time


4-12219
brn
2003-11-03 18:51
2004.01.05
SpeechAPI





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский