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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Система допуска (Бизнес-логика в процедурах 2), Как организовать доступ к базе данных 
:(
    Опции темы
AntonSaburov
Дата 20.3.2003, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Данная заметка появилась благодаря обсуждению темы
Бизнес логика в хранимых процедурах...

emchenko попросил меня рассказать о моем варианте распределения прав на объекты базы данных, что и делаю. Все замечания, дополнения, новые идеи будут приняты с благодарностью.

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

Таким образом у меня получилась такая структура

(таблица 1)

- Пользователь
- Тип сущности (фактически номер таблицы)
- ID сущности (ID в таблице)
- права на совершение действий (флаги)


Я не стал делать еще подтаблицу возможных действий, хотя этот вопрос остается до сих пор открытым.
Я подумал, что количество возможных действий над сущностью в моей практике не превышало 10. Поэтому я после некоторых раздумий сделал флаг длиной в 32 бита и создал таблицу, в которой эти флаги были расшифрованы для каждого типа сущности.

Так появились две вспомогательные таблицы

Первая содержала в себе список сущностей, к которым я хотел бы организовать допуск
- ID типа
- Наименование типа


Вторая содержала набор действий по отношению к этой сущности
- ID типа
- Номер бита (1..32)
- Расшифровка (что за операция может быть доступна по отношению к сущности, если этот бит установлен)


Теперь я имел уже достаточно IMHO удобную структуру – в хранимой процедуре я мог проверить по ID пользователя, типу сущности и ID сущности и какие действия данный пользователь может производить с конкретной сущностью по набору флагов.
Эту проверку можно сделать в хранимой процедуре перед выполнением каких-либо действий и либо отказать, либо разрешить эти действия.

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

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

И решено было реализовать идею групп. Я ее сделал более широким образом – ввел три уровня:
1. Пользователь
2. Должность – каждая фирма имеет список должностей и само собой какие-то права. Включает в себя пользователей. Вообще это нормально, когда в фирме каждый пользователь имеет какую-то должность. Или даже несколько
3. Группа – может включать в себя как отдельного пользователя, так и должность. Например топ-менеджеры, бухгалтерия, финансовый отдел.

Я на тот момент не смог сделать так, чтобы получать побитовое сложение одним запросом и потому все такие права хранил в отдельных таблицах для пользователей, должностей и групп наподобие таблицы 1 и по команде делал пересчет, который каждому пользователю определял права учитывая индивидуальные права, должностные и групповые. Результат записывался в таблицу 1. И по этой таблице производится проверка прав.

Таким образом если пользователь вызвал процедуру для совершения действия над какой-либо сущностью мне остается только взять ID пользователя, ID сущности и вытащит права пользователя по отношению к данной сущности. Накладывая битовую маску, которая по сути является числом, определяющим номер действия над сущностью, получим ЗЯ или НИЗЯ biggrin.gif

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

Также готов ответить на вопросы.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0777 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.