powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Проектирование базы данных
25 сообщений из 69, страница 2 из 3
Проектирование базы данных
    #38255864
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaksЯ создаю небольшую программку, которая будет использоваться в частных школах.Кстати, уточни пожалуйста, какой СУБД ты пользуешься и пользуешься ли вообще какой-нибудь?
Просто у большинства много-пользовательских СУБД уже есть готовые (системные) таблицы пользователей и системы ролей и/или групп. И твоя начальная задача решается не создаваемым таблицами а простым использованием имеющихся средств.
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38255875
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skoleAndreTM, ++
Только правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать."Логика на клиенте" vs "логика в БД" - это уже совсем другой холивар
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38255878
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlskoleAndreTM, ++
Только правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать.Вот за это "на уровне приложения" - убивать на месте.
У Васи версия клиента номер 1, он может будучи учеником может править урок. Ну баг там был в приложении. Ты обнаружил баг, исправил его и выпустил версию приложения номер 2. Счастье? А фиг! Вася зная о баге не стал обновлять свое приложение и спокойно правит уроки.
А директор школы сказал: "а почему это методист не может создавать уроки? Дайте ему доступ" и начнешь ты опять править приложение а потом распространять его...Вообще то это best practice
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38255881
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimberskoleAndreTM, ++
Только правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать."Логика на клиенте" vs "логика в БД" - это уже совсем другой холивар Это не логика, это интерфейс, который ты проводишь сквозь все приложение.
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38255884
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВот за это "на уровне приложения" - убивать на месте.Я, наверное, выразился как видел. Skole - как видел он. А говорим мы о разном.
Я хотел сказать, что привязки "роль-права" доступны в приложении. И "ученик<+/->модификация урока" - это связка в RightsTypes . На уровне приложения. А вот запись в Rights "модификация урока" <=> "GRANT/REVOKE INSERT,UPDATE,DELETE ON TABLE lessons TO ..." и будет на совести разработчика...
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38255936
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 можно править этому пользователю.
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38255948
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl, ну, я примерно это и имел в виду...
А то ТС что-то изначально не упомянул о наличии в его СУБД встроенных средств контроля доступа...
И про Оккама я тоже вроде уже...
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38255971
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внесем ясность, пользователь приложения не есть пользователь БД.

Далее, как реализуется такой функционал? Я уже вначале упомянул, что для этого создается класс, например 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.
public class MainForm:Form
{
    UserContext _userContext;

public MainForm(IUserContext userContext)
{
     InitializeComponents();
     _userContext= userContext;
}

private void MainForm_Load(object sender, EventArgs e)
{
     if(userContext.Role == Role.Administrators)
     {
        btnDelete.Enabled = true:
     }

      if(userContext.Role == Role.Editors)
     {
        btnEdit.Enabled = true:
     }
}


Это разумеется примитивное использование такого функционала разграничения доступа пользователей по ролям, но механизм четко выражен. Надеюсь, моя мысль понятна.
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38255980
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skoleВнесем ясность, пользователь приложения не есть пользователь БД.Все, дальше можно не читать.
Пользователь приложения не будет пользователем БД только в одном единственном случае - абсолютном отсутствии БД.
В общем: "В школу!"
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38255990
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты что, на каждого пользователя создаешь учетку в БД? Забавно конечно, но в этом смысла нет, для приложения достаточно одной учетки, чтобы инкапсулировать всех пользователей приложения, иначе, зачем весь этот функционал.

Кроме того, пользователи приложения ничего не знают об учетке (и правах) приложения в БД, им это и не нужно, любое приложение на соответствующем уровне представляет абстракцию для работы в БД.
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38256031
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skoleТы что, на каждого пользователя создаешь учетку в БД? Забавно конечно, но в этом смысла нет, для приложения достаточно одной учетки, чтобы инкапсулировать всех пользователей приложения, иначе, зачем весь этот функционал.Действительно, зачем брать готовый функционал для аутентификации и хранения паролей, который есть в любой БД? Мы нарисуем свой, с блекждеком и шлюхами!
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38256032
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimberкоторый есть в любой БД?СУБД конечно, но сути это не меняет.
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38256111
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimber,

Сейчас занят, вечером отпишусь подробно о всем что здесь прочитал.

Я использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле).
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38256112
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimberДействительно, зачем брать готовый функционал для аутентификации и хранения паролей, который есть в любой БД? Мы нарисуем свой, с блекждеком и шлюхами!
Для поделок на коленке или маленьких декстопных систем без развития (в чем сомневаюсь) - управление учетками и правами доступа на уровне БД - будет достаточно. Как только
* система начинает расти, в ней появляются бизнес-функции (это помимо сущностей - ака таблицы БД), на которые так же есть права доступа
* или систему необходимо выложить в инет (т.е. засветить логины/пароли к базе в инете)
начинаются проблемы и костыли и большие фундаментальные переделки

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

в представленном ТС случае, я бы сделал так:
1. таблица пользователей, у пользователя одна роль
2. таблица ролей (Администратор, Методист, Учитель, Ученик)
3. таблица роль-право_доступа (RoleId int, PermissionId int)
причем PermissionId - это код права доступа, его сделать перечнем (enum) в используемом ООП ЯП
4. так как ученикам не нужен логин/пароль - тупо их не заводить в системе, они будут иметь доступ только в публичную часть
5. когда пользователь авторизуется - необходимо хранить текущего пользователя и его роли/права в неком едином месте (зависит от используемой платформы и ЯП)
6. когда пользователь заходит в некую бизнес-функцию - написать метод, который будет проверять право доступа на эту функцию
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38256120
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaksЯ использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле).
вот, еще одна причина, по которой не следует писать бизнес-логику в хранимках
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38256139
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77,

я уже сказал и повторюсь еще раз: это просто холивар, бессмысленный и беспощадный. Если вы не умеете делать это на SQL (PL/SQL. TSQL ...), но умеете на java - делайте на java, вам никто не запрещает. Но только не надо говорить, что только ваш путь правильный, а остальные ведут в тупик. Управление правами - слишком простая вещь, чтобы у нее были принципиальные ограничения на способ реализации.

Если же вы сталкивались с тем, что на уровне БД не получается реализовать какую-то хитровывернутую систему управления правами - пример в студию, посмеемся посмотрим.


scymaksrockclimber,

Сейчас занят, вечером отпишусь подробно о всем что здесь прочитал.

Я использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле).Вам под вашу задачу идеально подходит Oracle APEX (попробовать и потренироваться на кошках можно тут - жмакайте на кнопочку "Request free workspace"). По сути, тот же аксесс, только на Оракле, бесплатно (!!!), с веб-интерфейсом и с кучей готовых шаблонов "как реализовать разграничения прав доступа" (как на уровне БД, так и на уровне приложения).
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38256163
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimber,
ага, холивар
ограничения я написал уже, про эффективность решения задач на том или ином ЯП
система прав доступа работает совместно с остальными частями системы

rockclimberЕсли же вы сталкивались с тем, что на уровне БД не получается реализовать какую-то хитровывернутую систему управления правами - пример в студию, посмеемся посмотрим.
я не использую подход разграничения прав доступа на уровне БД, а насчет примера - я уже говорил, что права есть к сущностям (таблицам БД) и к бизнес-функциям, которых в БД может и не быть
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38256211
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaks,

так и делать на RBAC

к чему хренатень-то с 4-мя таблицами? роли реализует стандартный софт СУБД

всех юзеров в одно и потом им раздавать роли (кто-то может быть в двух и более ролях), менять роли

ИС делать надо (основу хотя бы), а роли потом уж
PS Либо надо сразу полноценный проект в какой-нибудь системе спецификаций и управления требованиями, где и роли будут.
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38257204
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimberя уже сказал и повторюсь еще раз: это просто холивар, бессмысленный и беспощадный.Неправда. Это не холивор, а нашествие молодежи работавшей на одном-двух микро-проектах и не имеющих реального опыта.
Не сталкивались они с кретинами юзерами узнавшими логин-пароль под которым ходит в базу приложение и попытавшимися "подправить" базу напрямую. Не видели как стажер делает дамп базы и продает ее конкурентам, а большие боссы почему-то очень сердятся.
Не встречались наши носители розовых очков с нуждой иметь два-три разных клиента к базе данных... Вынос бизнес-логики на приложение в этом случае превращается в настоящий рай для энтомологов и психиатров.
Не было у них в жизни розысков "какая сволочь платежку исправила?!"...
Юность это счастье.

scymaksЯ использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле).Не обязательно использовать нативные средства через нативный синтаксис. Вполне можно ходить к базе через ODBC/ADO и делать всю работу через универсальные интерфейсы. Они спрячут почти все нативность внутрь драйверов и потом можно будет просто перенаправить DNS на другую базу и все. Переделки в этом случае все равно будут, но минимальные.

Ну и в конце-концов, если заказчик хочет Оракл (и готов его купить) - можно взять бесплатную GA редакцию и разрабатывать свой проект на ней. Практически все современные СУБД имеют сейчас бесплатные редакции предназначенные для разработки пилотных версий и/или студенческих игрищь.
Но я очень советую заранее определиться с СУБД и писать сразу на ней. Даже если ты специально будешь ограничивать себя диалектом SQL-92 - все равно рано или поздно столкнешься с необходимостью сделать кое-что нативно.
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38257323
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlrockclimberя уже сказал и повторюсь еще раз: это просто холивар, бессмысленный и беспощадный.Неправда. Это не холивор, а нашествие молодежи работавшей на одном-двух микро-проектах и не имеющих реального опыта.
Не сталкивались они с кретинами юзерами узнавшими логин-пароль под которым ходит в базу приложение и попытавшимися "подправить" базу напрямую. Не видели как стажер делает дамп базы и продает ее конкурентам, а большие боссы почему-то очень сердятся.
Все должно развиваться эвалюционно. Образный пример: если на запорожец приладить колеса от вездехода, то вездеходом он не станет. Станет чуть-чуть проходимее, но не вездеходом.
Это я к тому что один правильный кусок программы не спасет ее от взлома, просто чуть-чуть его усложнит.
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38257366
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВсе должно развиваться эвалюционно. Образный пример: если на запорожец приладить колеса от вездехода, то вездеходом он не станет. Станет чуть-чуть проходимее, но не вездеходом.
Это я к тому что один правильный кусок программы не спасет ее от взлома, просто чуть-чуть его усложнит.Видишь ли, дизайн систем это не запорожец. Дизайн систем это ответ на вопрос "есть у запорожца мотор и колеса или нету". Сейчас на запорожец можно в принципе поставить колеса от вездехода, но гусеницы или пропеллер к нему не приладить никак. Для таких переделок эволюции мало, для них полный ре-дизайн нужен. А если ты изначально хотел получить вертолет, но сделал запорожец тебе никакая эволюция уже не поможет.
Так и здесь. Если изначально пойти по пути наименьшего сопротивления и сделать секьюрити и бизнес-логику на уровне приложения, то потом тебе придется делать полный рефакторинг и клиента и сервера чтобы перенести их на сервер.
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38257491
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, ну да... Действительно, прослеживается, что ТС начал разработку БД как для файл-сервера. Без понимания, что в клиент-серверной СУБД клиенту всё равно не обломится из базы больше информации, чем предусмотрено правами при коннекте.
Видимо, думает, что если guest в клиентском интерфейсе жмакнет "удалить урок" - то СУБД сразу его и послушается Хотя, если сделать коннекты, как предлагали здесь некоторые - то так и будет
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38261540
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimberscymaksrockclimber,

как быть с тем, что скажем у пользователя студента нет логина, а у администртора на есть?А в чем проблема? Проблема будет, когда заказчик полгода спустя скажет - а давайте сделаем логины студентам, пусть расписание сами узнают! И вы еще раз сделаете то, что уже делали по отдельности для администраторов, методистов и учителей.
Вместо того, чтобы сделать один раз для всех и забыть.

Ну при моем подходе были бы логины у студентов тоже. Если бы требовалось чтобы все пользователи имели бы доступ через логин, то он был бы вынесен в таблицу users
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38261543
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Схема разрабатывается для web приложения. Так что актуальная версия всегда будет у всех.
...
Рейтинг: 0 / 0
Проектирование базы данных
    #38275667
Dmitry Eliseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне вот интересно, а как быть (в случае когда доступом рулит БД), если требуется доступ только к определённым записям в таблице, а не ко всей таблице ? Например, чтобы пользователь 1 мог удалять только свои записи, просматривать записи пользователя 2, но не видел записей пользователя 3 и 4 ?
...
Рейтинг: 0 / 0
25 сообщений из 69, страница 2 из 3
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Проектирование базы данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]