|
|
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaksЯ создаю небольшую программку, которая будет использоваться в частных школах.Кстати, уточни пожалуйста, какой СУБД ты пользуешься и пользуешься ли вообще какой-нибудь? Просто у большинства много-пользовательских СУБД уже есть готовые (системные) таблицы пользователей и системы ролей и/или групп. И твоя начальная задача решается не создаваемым таблицами а простым использованием имеющихся средств. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:43 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
skoleAndreTM, ++ Только правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать."Логика на клиенте" vs "логика в БД" - это уже совсем другой холивар ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:49 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White OwlskoleAndreTM, ++ Только правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать.Вот за это "на уровне приложения" - убивать на месте. У Васи версия клиента номер 1, он может будучи учеником может править урок. Ну баг там был в приложении. Ты обнаружил баг, исправил его и выпустил версию приложения номер 2. Счастье? А фиг! Вася зная о баге не стал обновлять свое приложение и спокойно правит уроки. А директор школы сказал: "а почему это методист не может создавать уроки? Дайте ему доступ" и начнешь ты опять править приложение а потом распространять его...Вообще то это best practice ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:55 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberskoleAndreTM, ++ Только правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать."Логика на клиенте" vs "логика в БД" - это уже совсем другой холивар Это не логика, это интерфейс, который ты проводишь сквозь все приложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:57 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White OwlВот за это "на уровне приложения" - убивать на месте.Я, наверное, выразился как видел. Skole - как видел он. А говорим мы о разном. Я хотел сказать, что привязки "роль-права" доступны в приложении. И "ученик<+/->модификация урока" - это связка в RightsTypes . На уровне приложения. А вот запись в Rights "модификация урока" <=> "GRANT/REVOKE INSERT,UPDATE,DELETE ON TABLE lessons TO ..." и будет на совести разработчика... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 23:02 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
AndreTMWhite OwlВот за это "на уровне приложения" - убивать на месте.Я, наверное, выразился как видел. Skole - как видел он. А говорим мы о разном.О разном? Ну вот я говорю о том что: Вариант 1) Права пользователя жестко завязаны на его роль. Тогда таблица Rights не нужна вообще и приложение узнав к какой роли пользователь принадлежит включает/выключает доступ до определенного модуля. Вариант 2) Роль это глобальное понятие, например Учитель. Но учитель биологии не может править уроки по физике и наоборот, тогда нужно вводить "вторичная роль" и доступ до модуля "учитель" для МарьВанны выдается по ее роли, а потом гранулируется второй раз при помощи таблицы rights и выдается доступ до классов соответствующего типа. В обоих вариантах доступ разграничивается на сервере. А skole предлагает: skoleТолько правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать. То есть по его мнению, если читать дословно, то получается что пользователь приходит в базу данных и не может ничего сделать на уровне СУБД. Потом в приложении отрабатывает некая волшебная функция которая разрешает этому конкретному пользователю что-то делать. В итоге получаем нечто теоретически невозможное. Предположим что skole описался и он имел в виду что пользователь может делать все что угодно на уровне СУБД, но приложение прочитав роль пользователя и узнав что это роль с ограниченными правами выключает доступ до определенных модулей. (Это уже вполне реальная ситуация и я ее видел в живую неоднократно.) Но тогда, смотри мой предыдущий ответ для skola. Это абсолютно незащищенное от злоумышленников решение, и оно чрезвычайно шатко когда дело касается целостности данных. В случае если СУБД без-юзерного типа (FoxPro, SQLite, etc), то это единственно возможное решение и тогда действительно будет нужна таблица users и ручное придумывание системы разграничения прав доступа. Опасно и ненадежно, но увы без вариантов. Но если СУБД имеет встроенную систему распознавания пользователя (MS SQL, Oracle, MySQL, etc) то надо ею воспользоваться и пользователь пришедший в СУБД будет иметь частичные права (по его роли) не смотря на клиента. В этом случае делать права доступа на уровне приложения - лишняя работа. А если на такой СУБД давать права изначально на все, а потом делать правила доступа на уровне клиента, то это повод оторвать разработчику руки по самые гланды. AndreTMЯ хотел сказать, что привязки "роль-права" доступны в приложении. И "ученик<+/->модификация урока" - это связка в RightsTypes . На уровне приложения. А вот запись в Rights "модификация урока" <=> "GRANT/REVOKE INSERT,UPDATE,DELETE ON TABLE lessons TO ..." и будет на совести разработчика...А при чем здесь разработчик? Это работа для Администратора а не разработчика. В модуле Администратора будет кнопка "дать/отнять роль учителя" и по ее нажатии будет запускаться эта команда. И все собственно. Вот если TC будет делать разграничение по типу уроков (биология-физика-рисование), то тогда надо будет делать еще и запись в Rights с указанием какие именно строки из lessons можно править этому пользователю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 00:27 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White Owl, ну, я примерно это и имел в виду... А то ТС что-то изначально не упомянул о наличии в его СУБД встроенных средств контроля доступа... И про Оккама я тоже вроде уже... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 00:42 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Внесем ясность, пользователь приложения не есть пользователь БД. Далее, как реализуется такой функционал? Я уже вначале упомянул, что для этого создается класс, например UserContext, который реализует интерфейс IUserContext. На входе пользователя мы загружаем этот класс данными из БД, настроек приложения, конфигурационных файлов, словом состав класса и структура интерфейса дело воображения. Предположим наш пользователь производит какие-то действия, открывает форму например, тогда мы передаем в форму его UserContext, немного псевдокода: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Это разумеется примитивное использование такого функционала разграничения доступа пользователей по ролям, но механизм четко выражен. Надеюсь, моя мысль понятна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 01:24 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
skoleВнесем ясность, пользователь приложения не есть пользователь БД.Все, дальше можно не читать. Пользователь приложения не будет пользователем БД только в одном единственном случае - абсолютном отсутствии БД. В общем: "В школу!" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 02:26 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Ты что, на каждого пользователя создаешь учетку в БД? Забавно конечно, но в этом смысла нет, для приложения достаточно одной учетки, чтобы инкапсулировать всех пользователей приложения, иначе, зачем весь этот функционал. Кроме того, пользователи приложения ничего не знают об учетке (и правах) приложения в БД, им это и не нужно, любое приложение на соответствующем уровне представляет абстракцию для работы в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 03:50 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
skoleТы что, на каждого пользователя создаешь учетку в БД? Забавно конечно, но в этом смысла нет, для приложения достаточно одной учетки, чтобы инкапсулировать всех пользователей приложения, иначе, зачем весь этот функционал.Действительно, зачем брать готовый функционал для аутентификации и хранения паролей, который есть в любой БД? Мы нарисуем свой, с блекждеком и шлюхами! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 08:18 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberкоторый есть в любой БД?СУБД конечно, но сути это не меняет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 08:19 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimber, Сейчас занят, вечером отпишусь подробно о всем что здесь прочитал. Я использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 09:45 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberДействительно, зачем брать готовый функционал для аутентификации и хранения паролей, который есть в любой БД? Мы нарисуем свой, с блекждеком и шлюхами! Для поделок на коленке или маленьких декстопных систем без развития (в чем сомневаюсь) - управление учетками и правами доступа на уровне БД - будет достаточно. Как только * система начинает расти, в ней появляются бизнес-функции (это помимо сущностей - ака таблицы БД), на которые так же есть права доступа * или систему необходимо выложить в инет (т.е. засветить логины/пароли к базе в инете) начинаются проблемы и костыли и большие фундаментальные переделки насчет бизнес-функции - да можно в хранимки запихнуть бизнес-логику и опять через базу рулить правами, что не всегда есть хорошо - на ООП ЯП можно эффективней сделать то, чего нельзя сделать на SQL и наоборот и плюс логика может размазаться в двух местах с дублированием кода в представленном ТС случае, я бы сделал так: 1. таблица пользователей, у пользователя одна роль 2. таблица ролей (Администратор, Методист, Учитель, Ученик) 3. таблица роль-право_доступа (RoleId int, PermissionId int) причем PermissionId - это код права доступа, его сделать перечнем (enum) в используемом ООП ЯП 4. так как ученикам не нужен логин/пароль - тупо их не заводить в системе, они будут иметь доступ только в публичную часть 5. когда пользователь авторизуется - необходимо хранить текущего пользователя и его роли/права в неком едином месте (зависит от используемой платформы и ЯП) 6. когда пользователь заходит в некую бизнес-функцию - написать метод, который будет проверять право доступа на эту функцию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 09:46 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaksЯ использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле). вот, еще одна причина, по которой не следует писать бизнес-логику в хранимках ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 09:53 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
17-77, я уже сказал и повторюсь еще раз: это просто холивар, бессмысленный и беспощадный. Если вы не умеете делать это на SQL (PL/SQL. TSQL ...), но умеете на java - делайте на java, вам никто не запрещает. Но только не надо говорить, что только ваш путь правильный, а остальные ведут в тупик. Управление правами - слишком простая вещь, чтобы у нее были принципиальные ограничения на способ реализации. Если же вы сталкивались с тем, что на уровне БД не получается реализовать какую-то хитровывернутую систему управления правами - пример в студию, посмеемся посмотрим. scymaksrockclimber, Сейчас занят, вечером отпишусь подробно о всем что здесь прочитал. Я использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле).Вам под вашу задачу идеально подходит Oracle APEX (попробовать и потренироваться на кошках можно тут - жмакайте на кнопочку "Request free workspace"). По сути, тот же аксесс, только на Оракле, бесплатно (!!!), с веб-интерфейсом и с кучей готовых шаблонов "как реализовать разграничения прав доступа" (как на уровне БД, так и на уровне приложения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 10:05 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimber, ага, холивар ограничения я написал уже, про эффективность решения задач на том или ином ЯП система прав доступа работает совместно с остальными частями системы rockclimberЕсли же вы сталкивались с тем, что на уровне БД не получается реализовать какую-то хитровывернутую систему управления правами - пример в студию, посмеемся посмотрим. я не использую подход разграничения прав доступа на уровне БД, а насчет примера - я уже говорил, что права есть к сущностям (таблицам БД) и к бизнес-функциям, которых в БД может и не быть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 10:23 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaks, так и делать на RBAC к чему хренатень-то с 4-мя таблицами? роли реализует стандартный софт СУБД всех юзеров в одно и потом им раздавать роли (кто-то может быть в двух и более ролях), менять роли ИС делать надо (основу хотя бы), а роли потом уж PS Либо надо сразу полноценный проект в какой-нибудь системе спецификаций и управления требованиями, где и роли будут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 10:44 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberя уже сказал и повторюсь еще раз: это просто холивар, бессмысленный и беспощадный.Неправда. Это не холивор, а нашествие молодежи работавшей на одном-двух микро-проектах и не имеющих реального опыта. Не сталкивались они с кретинами юзерами узнавшими логин-пароль под которым ходит в базу приложение и попытавшимися "подправить" базу напрямую. Не видели как стажер делает дамп базы и продает ее конкурентам, а большие боссы почему-то очень сердятся. Не встречались наши носители розовых очков с нуждой иметь два-три разных клиента к базе данных... Вынос бизнес-логики на приложение в этом случае превращается в настоящий рай для энтомологов и психиатров. Не было у них в жизни розысков "какая сволочь платежку исправила?!"... Юность это счастье. scymaksЯ использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле).Не обязательно использовать нативные средства через нативный синтаксис. Вполне можно ходить к базе через ODBC/ADO и делать всю работу через универсальные интерфейсы. Они спрячут почти все нативность внутрь драйверов и потом можно будет просто перенаправить DNS на другую базу и все. Переделки в этом случае все равно будут, но минимальные. Ну и в конце-концов, если заказчик хочет Оракл (и готов его купить) - можно взять бесплатную GA редакцию и разрабатывать свой проект на ней. Практически все современные СУБД имеют сейчас бесплатные редакции предназначенные для разработки пилотных версий и/или студенческих игрищь. Но я очень советую заранее определиться с СУБД и писать сразу на ней. Даже если ты специально будешь ограничивать себя диалектом SQL-92 - все равно рано или поздно столкнешься с необходимостью сделать кое-что нативно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 18:38 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White Owlrockclimberя уже сказал и повторюсь еще раз: это просто холивар, бессмысленный и беспощадный.Неправда. Это не холивор, а нашествие молодежи работавшей на одном-двух микро-проектах и не имеющих реального опыта. Не сталкивались они с кретинами юзерами узнавшими логин-пароль под которым ходит в базу приложение и попытавшимися "подправить" базу напрямую. Не видели как стажер делает дамп базы и продает ее конкурентам, а большие боссы почему-то очень сердятся. Все должно развиваться эвалюционно. Образный пример: если на запорожец приладить колеса от вездехода, то вездеходом он не станет. Станет чуть-чуть проходимее, но не вездеходом. Это я к тому что один правильный кусок программы не спасет ее от взлома, просто чуть-чуть его усложнит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 21:00 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dima TВсе должно развиваться эвалюционно. Образный пример: если на запорожец приладить колеса от вездехода, то вездеходом он не станет. Станет чуть-чуть проходимее, но не вездеходом. Это я к тому что один правильный кусок программы не спасет ее от взлома, просто чуть-чуть его усложнит.Видишь ли, дизайн систем это не запорожец. Дизайн систем это ответ на вопрос "есть у запорожца мотор и колеса или нету". Сейчас на запорожец можно в принципе поставить колеса от вездехода, но гусеницы или пропеллер к нему не приладить никак. Для таких переделок эволюции мало, для них полный ре-дизайн нужен. А если ты изначально хотел получить вертолет, но сделал запорожец тебе никакая эволюция уже не поможет. Так и здесь. Если изначально пойти по пути наименьшего сопротивления и сделать секьюрити и бизнес-логику на уровне приложения, то потом тебе придется делать полный рефакторинг и клиента и сервера чтобы перенести их на сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 21:52 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Ну да, ну да... Действительно, прослеживается, что ТС начал разработку БД как для файл-сервера. Без понимания, что в клиент-серверной СУБД клиенту всё равно не обломится из базы больше информации, чем предусмотрено правами при коннекте. Видимо, думает, что если guest в клиентском интерфейсе жмакнет "удалить урок" - то СУБД сразу его и послушается Хотя, если сделать коннекты, как предлагали здесь некоторые - то так и будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2013, 01:38 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberscymaksrockclimber, как быть с тем, что скажем у пользователя студента нет логина, а у администртора на есть?А в чем проблема? Проблема будет, когда заказчик полгода спустя скажет - а давайте сделаем логины студентам, пусть расписание сами узнают! И вы еще раз сделаете то, что уже делали по отдельности для администраторов, методистов и учителей. Вместо того, чтобы сделать один раз для всех и забыть. Ну при моем подходе были бы логины у студентов тоже. Если бы требовалось чтобы все пользователи имели бы доступ через логин, то он был бы вынесен в таблицу users ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 11:00 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White Owl, Схема разрабатывается для web приложения. Так что актуальная версия всегда будет у всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 11:01 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Мне вот интересно, а как быть (в случае когда доступом рулит БД), если требуется доступ только к определённым записям в таблице, а не ко всей таблице ? Например, чтобы пользователь 1 мог удалять только свои записи, просматривать записи пользователя 2, но не видел записей пользователя 3 и 4 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 00:47 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38257366&tid=1341793]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
152ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 459ms |

| 0 / 0 |
