Для более четкого разграничения доступа клиентов к записям в таблицах нужно иметь возможность указывать признаки доступа в свойствах записи таблицы "Пользователи". Для этого к этой таблице должен иметься доступ, как и к любой другой, но с ограничением на удаление системных полей и с разрешением создания и редактирования пользовательских полей. Тогда в фильтре будет достаточно поставить условие сравнения пользовательского поля с контрольным, чтобы отсечь записи, к которым не нужно давать доступ.
Пример. База данных по решениям, принимаемым собственниками помещений в многоквартирном доме. Нужно выводить только записи, касающиеся конкретного собственника. Если ввести в таблице Пользователи поле ссылки на список домов и задать условия на совпадения полей "Адрес дома" в таблице "Решения общих собраний" и "Пользователи", то пользователь будет видеть только решения по дому, в котором он является собственником помещений. Если сделать возможность множественного выбора в этом поле, то по фильтру со свойством "содержит" можно выделить решения по всем домам, где у собственника есть квартиры. Ну это как пример. Кроме того, можно было бы хранить и иные данные, относящиеся к пользователю, либо ссылку на таблицу с ними, чтобы можно было выстраивать условия по соответствию в полях ссылки. То есть можно задать одно дополнительное поле ссылки на произвольную запись вспомогательной системной таблицы "Реквизиты" (например), где можно настраивать структуру как угодно и делать какие угодно ключевые поля, в том числе и для разграничения доступа, а к ним получать доступ по ссылке ['Ссылка']['Поле']. Второй вариант более безопасен, но под него нужно будет немного переписывать фильтры, чтобы можно было делать в режиме помощника выборку необходимого поля по ссылке.
2
Добавление своих полей в таблицу "Пользователи"
Автор Александр Пономарев, 23 июня 2014 11:05
Пользователи
Сообщений в теме: 3
#1
Отправлено 23 Июнь 2014 - 11:05
#2
Отправлено 23 Июнь 2014 - 14:48
Для этого всего в программе уже есть функционал связи с пользователями. Создаете свою таблицу и привязываете ее к системной таблице пользователей, в результате получаете то самое расширение. Причем, в отличии от предложенного вами, таким образом можно привязать несколько таблиц, например Клиенты и Сотрудники в стандартной конфигурации. У них разный набор полей, но в обеих можно добавлять/менять пользователей. К тому же можно выбирать для каждой записи, привязывать ее или нет. Может конечно это и не то что вы хотите, но расширение непосредственно системной таблицы у нас не планируется.
#3
Отправлено 24 Июнь 2014 - 17:29
Это не то. Вы предлагаете закреплять запись за одним хозяином, прописывая его явно. В моем случае у дома несколько собственников и все они должны иметь доступ к решениям собрания этого дома. Их невозможно описать вашими средствами, не указав явно ручками в перечислении условий. При этом в таблице есть ссылка НА пользователя, а в самом пользователе нет ссылки НА таблицу.
Я думал, как проще реализовать задачу и пришел к следующему выводу:
1. Нужно ввести системную таблицу с названием, например "Доступ".
2. В таблице "Пользователи" завести новое поле связи с таблицей "Доступ" с указанием на конкретную запись из этой таблицы, привязанную к данному пользователю.
3. В таблице "Доступ" структура полей определяется самим пользователем. Для каждой таблицы он может делать поле связи с указанием значения, по которому осуществляется фильтрация. Причем выбрать можно несколько значений.
4. В таблицах, к которым нужно разграничивать доступ, заводится поле, являющееся ссылкой на запись поля "Доступ" через таблицу "Пользователи". То есть для каждого конкретного пользователя это значение (значения) подставляются автоматически.
5. В фильтре в качестве условия указывается "Поле Х" в таблице равно или содержит значение "Поля Y" из таблицы "Доступ". По этому фильтру выводятся только те записи, нужное поле которых совпадает с фильтрующим значением.
На мой взгляд это гораздо гибче, нежели то, что сейчас есть у вас и не требует особых изменений в коде.
Заводится новый пользователь - собственник, ему прописывают объекты, связанные с ним. Он имеет доступ к записям, в которых совпадают эти ключевые признаки. И так во многих других задачах.
Я думал, как проще реализовать задачу и пришел к следующему выводу:
1. Нужно ввести системную таблицу с названием, например "Доступ".
2. В таблице "Пользователи" завести новое поле связи с таблицей "Доступ" с указанием на конкретную запись из этой таблицы, привязанную к данному пользователю.
3. В таблице "Доступ" структура полей определяется самим пользователем. Для каждой таблицы он может делать поле связи с указанием значения, по которому осуществляется фильтрация. Причем выбрать можно несколько значений.
4. В таблицах, к которым нужно разграничивать доступ, заводится поле, являющееся ссылкой на запись поля "Доступ" через таблицу "Пользователи". То есть для каждого конкретного пользователя это значение (значения) подставляются автоматически.
5. В фильтре в качестве условия указывается "Поле Х" в таблице равно или содержит значение "Поля Y" из таблицы "Доступ". По этому фильтру выводятся только те записи, нужное поле которых совпадает с фильтрующим значением.
На мой взгляд это гораздо гибче, нежели то, что сейчас есть у вас и не требует особых изменений в коде.
Заводится новый пользователь - собственник, ему прописывают объекты, связанные с ним. Он имеет доступ к записям, в которых совпадают эти ключевые признаки. И так во многих других задачах.
Сообщение отредактировал Александр Пономарев: 24 Июнь 2014 - 17:32
#4
Отправлено 25 Июнь 2014 - 08:39
Что мешает Вам сейчас добавить ту же самую таблицу "Доступ" как не системную и точно также привязать ее к пользователям? В чем разница то? У системных таблиц нет функционала добавления полей, фильтров и т.д., и они скрыты от непосредственного изменения (потому и системные). Никто не будет городить сейчас огород с расширением системных таблиц, так как для этого уже есть пользовательские таблицы. Это кардинальное изменение парадигмы существующей программы, и вовсе не "не требует особых изменений в коде", как вы написали, а как раз таки наоборот. Вся гибкость уже заключена в таблицах конфигурации.
Что же касается фильтров по неким "дополнительным признакам", это в большинстве случаев реализуется через вложенные запросы. Примеры уже приводили на форуме. Например, при необходимости отобрать в некой таблице дома, в которых текущий пользователь является собственником, составляется условие к полю Дом, которое приравнивается к результату запроса из таблицы Собственников (привязанной к пользователям), где уже поле пользователь приравнено к текущему пользователю. Так что проблемы тут нет особо (за исключением того, что такие условия сейчас вручную нужно составлять, но это уже другой вопрос).
Что же касается фильтров по неким "дополнительным признакам", это в большинстве случаев реализуется через вложенные запросы. Примеры уже приводили на форуме. Например, при необходимости отобрать в некой таблице дома, в которых текущий пользователь является собственником, составляется условие к полю Дом, которое приравнивается к результату запроса из таблицы Собственников (привязанной к пользователям), где уже поле пользователь приравнено к текущему пользователю. Так что проблемы тут нет особо (за исключением того, что такие условия сейчас вручную нужно составлять, но это уже другой вопрос).
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных