Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разграничение доступа на уровне записей / 11 сообщений из 11, страница 1 из 1
28.01.2022, 20:49
    #40130439
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разграничение доступа на уровне записей
Добрый час! Подскажите как реализовать для разных пользователей доступ только к их к записям в одной таблице?
...
Рейтинг: 0 / 0
28.01.2022, 20:58
    #40130440
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разграничение доступа на уровне записей
...
Рейтинг: 0 / 0
28.01.2022, 21:03
    #40130444
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разграничение доступа на уровне записей
invm, Благодарю!
...
Рейтинг: 0 / 0
29.01.2022, 11:48
    #40130491
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разграничение доступа на уровне записей
На самом деле, если редакция сервера не позволяет, или лень разбираться с безопасностью на уровне строк - можно проще, и более кондовым способом.
Нужно создать View, в котором фильтровать записи, в зависимости от пользователя, соответственно встроив логику security function в запрос, лежащий в основе View.
Ну и, соответственно, закрыв везде доступ для пользователей к таблицам, и открыв - к вьюхам.

Кстати, у такого подхода есть несколько значительных преимуществ перед вариантом с row level security.
1. Производительность.
Когда вы определяете security function для какой-то таблицы она всегда применяется через nested loop к каждой строке таблицы. И если этих строк МНОГО - это влетит вам в копеечку с т.з. производительности.
Если вы определили security function с использованием каких-либо пользовательских таблиц (например - списка принадлежности пользователя к филиалу) - нужно позаботиться, чтобы эта вспомогательная таблица была правильно проиндексирована, а запрос, лежащий в основе security function - был очень, очень, очень оптимизированным.
Имейте также ввиду, что вы, скорее всего, лишитесь возможности использовать подсказки уровня запроса, типа option (hash join), поэтому ваш прикладной код может внезапно сломаться, если вы навесите секьюрность потом, на работающий код.
2. Отсутствие возможности "запретить" row level security для каких-то отдельных запросов, и оставить включенной для всех остальных.
Вам также придется не забыть прописать в security function явным образом возможность для суперпользователей просматривать всё содержимое.

Короче говоря, row level security - хороша всем, если вы навешиваете ее на небольшую табличку, максимум в пару десятков миллионов записей, ваша security function представляет из себя скалярное выражение, и вам никогда не потребуется прочитывать всю таблицу из под ограниченного пользователя. Ну и программисты у вас не криворукие рукожопы.

Я, например, вынужден был отказаться, и вернуться в вьюхам.
...
Рейтинг: 0 / 0
29.01.2022, 13:24
    #40130498
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разграничение доступа на уровне записей
JDV
invm, Благодарю!


Это поспешно , вы просто не знаете еще своего счастья
...
Рейтинг: 0 / 0
29.01.2022, 16:59
    #40130518
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разграничение доступа на уровне записей
Ролг Хупин, а как лучше?)
...
Рейтинг: 0 / 0
29.01.2022, 17:00
    #40130519
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разграничение доступа на уровне записей
uaggster, а покажите пример кода именно фильтрации?
...
Рейтинг: 0 / 0
29.01.2022, 19:01
    #40130527
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разграничение доступа на уровне записей
JDV
Ролг Хупин, а как лучше?)


Задачу обдумайте хорошо и почитайте то, чо написал uaggster. Производительность и пр.
...
Рейтинг: 0 / 0
29.01.2022, 19:29
    #40130529
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разграничение доступа на уровне записей
Ролг Хупин, я понял .... уже изучаю ...
...
Рейтинг: 0 / 0
29.01.2022, 19:35
    #40130530
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разграничение доступа на уровне записей
...
Рейтинг: 0 / 0
10.02.2022, 10:04
    #40133028
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разграничение доступа на уровне записей
JDV, Добрый час А подскажите как для это функции сделать два набора сотрудников с разными таками же уровнями но чтоб они видели друг друга не зависимо ... к примеру 2 отдела ?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- Create filter title function
CREATE FUNCTION RLSFilterDemo.fn_getTitle(@title AS varchar(20))  
    RETURNS TABLE  
WITH SCHEMABINDING  
AS  
RETURN
    SELECT 1 AS result   
    WHERE USER_NAME() IN (
    SELECT A.title 
    FROM dbo.tb_Test_ViewPermission AS A
        INNER JOIN  dbo.tb_Test_ViewPermission AS B
        ON a.level_no <= B.level_no
    WHERE B.title = @title)



Небольшое объяснение реализации кода: используйте level_no для управления уровнем доступа пользователя к данным, чем меньше значение level_no, тем выше уровень и тем выше полномочия. А именно: level_no равен 0 (соответствует пользователю CEO), вы можете просматривать level_no как 0 (соответствует самому генеральному директору), 1 (соответствует пользователю Manger) и 2 (соответствует обычному пользователю Employee); level_no равно 1 для просмотра данных о себе и сотруднике; и level_no Для 2 можно просматривать только свои собственные строки данных. Когда мы обнаруживаем, что запрошенный пользователь соответствует соответствующему заголовку, мы думаем, что этот пользователь имеет соответствующие разрешения, то есть функция возвращает значение 1, в противном случае мы думаем, что нет разрешения на доступ к соответствующей строке.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разграничение доступа на уровне записей / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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