SQL Server Row Level Security не работает на внешних ключах - PullRequest
0 голосов
/ 16 января 2019

У меня работает база данных SQL Azure. Там у меня есть 3 таблицы

  • Пользователи
  • UserProject
  • Проекты

Нормальные отношения «многие ко многим». Пользователь может иметь несколько проектов, а проект может иметь несколько пользователей. Строки связаны по идентификаторам, и ForeignKey-Constraitns установлены соответственно.

Я хочу включить защиту на уровне строк для таблицы проектов. Вот что я сделал:

CREATE FUNCTION dbo.fn_predicate(@tenant varchar(25))     
    RETURNS TABLE     
    WITH SCHEMABINDING
AS
    RETURN SELECT 1 AS fn_accessResult
        WHERE SESSION_CONTEXT(N'Tenant') = @tenant ;
GO

Тогда я создал политику:

CREATE SECURITY POLICY mandantPolicy
    ADD FILTER PREDICATE dbo.fn_predicate(Tenant) ON dbo.Projects,
    ADD BLOCK  PREDICATE dbo.fn_predicate(Tenant) ON dbo.Projects
GO

Затем я включил политику, и она работает нормально. Это означает, что я могу видеть только проекты арендатора, для которого я установил SESSION_CONTEXT. А также вставка соответственно заблокирована ..

Например:

-- Works as expected (new project inserted)
EXEC SP_SET_SESSION_CONTEXT @key=N'Tenant', @value='foo'
INSERT INTO Projects (Name, Tenant) VALUES ('Dummy', 'foo')

-- Works as expected (insert blocked)
EXEC SP_SET_SESSION_CONTEXT @key=N'Tenant', @value='bar'
INSERT INTO Projects (Name, Tenant) VALUES ('Dummy', 'foo')

Что я ожидал бы, так это то, что безопасность на уровне строк также применяется к таблице отношений UserProject. Например:

-- Insert a new project for tenant 'foo'
-- This results in a new project with id 1
EXEC SP_SET_SESSION_CONTEXT @key=N'Tenant', @value='foo'
INSERT INTO Projects (Name, Tenant) VALUES ('Dummy', 'foo')

-- Try to link the project from tenant foo with a user (id 5) but as tenant 'bar'
EXEC SP_SET_SESSION_CONTEXT @key=N'Tenant', @value='bar'
INSERT INTO UserProject (ProjectId, UserId) VALUES (1, 5)

По моему мнению, эта последняя ВСТАВКА должна быть заблокирована, поскольку арендатор настроен на 'bar', и поэтому проект, который ранее был добавлен как арендатор 'foo', не должен быть виден пользователю 'bar'.

Мне здесь не хватает конфигурации? Или это просто не поддерживается RLS?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...