Добрый день всем!
Недавно обнаружена необычная особенность в ограничении доступа по полям.
Поскольку в руководстве администратора об этом не сказано, думаю, об этом будет полезно узнать всем, кто собирается ограничить доступ по полям для пользователей системы.
Итак, постановка задачи.
Есть некоторая группа пользователей, для которой необходимо запретить просмотр и редактирование некоторого поля (например, Зарплата) в разделе, например, Контакты.
Общая модель прав доступа в системе такова, что при определении уровня прав доступа система анализирует права пользователя и всех групп, в которые он входит, и исходя из этого берет максимальные права. Это справедливо для прав по группам таблиц и прав по записям.
Однако, только для MSSQL, и только для прав доступа по полям, наблюдается следующее исключение. При определении уровня прав пользователя на некоторое поле используются встроенные средства MSSQL, использование которых приводит к тому, что при определении уровня прав доступа берутся не максимальные, а минимальные права пользователя на поле.
Пример:
Есть группа Все пользователи, группа Операторы, группа Начальство. Требуется для обычных пользователей скрыть доступ на поле Зарплата карточки Контакта, причем сделать это на уровне прав доступа на поле.
Решение, которое подходит для MSSQL: для группы Все пользователи доступ по полям не ограничивать (по умолчанию полный доступ), всех обычных пользователей поместить в группу Операторы, и группе Операторы запретить чтение поля Зарплата в таблице Контакт. Группе пользователей Начальство не изменять прав доступа по полям (по умолчанию полный доступ).
Недостаток - все обычные пользователи должны быть помещены в группу Операторы.
Преимущество - высокая скорость работы, т.к. используются "родные" механизмы СУБД MSSQL.
Решение, которое подойдет для Oracle и Firebird: для группы Все пользователи запретить доступ на поле Зарплата сущности Контакт, для группы Начальство не ограничивать доступ по полям.
Достоинство - простота настройки.
Недостаток - искусственная реализация на уровне запросов и ядра, более низкая скорость.
Кстати, этот материал актуален для 3.3.0, 3.3.1. Для других версий не проверял, очень вероятно, что это справедливо для всех версий начиная с 3.1.1.