Реферат: Row-Level Security в РСУБД
CustomerID nchar(5) NULL ,
EmployeeID int NULL ,
OrderDate datetime NULL ,
RequiredDate datetime NULL ,
ShippedDate datetime NULL ,
ShipVia int NULL ,
Freight money NULL CONSTRAINT DF_Orders_Freight DEFAULT(0),
ShipName nvarchar(40) NULL ,
ShipAddress nvarchar(60) NULL ,
ShipCity nvarchar(15) NULL ,
ShipRegion nvarchar(15) NULL ,
ShipPostalCode nvarchar(10) NULL ,
ShipCountry nvarchar(15) NULL ,
CONSTRAINT FK_Orders_Employees FOREIGN KEY (EmployeeID)
REFERENCES Employees (EmployeeID)
)
Предположим, что правила корпоративной безопасности по отношению к данным заказов определены следующим образом:
Менеджеры по продажам (роль ‘Sales Representative’) имеют право просматривать только «свои» заказы и не могут видеть заказы, введенные другими менеджерами по продажам.
Директор по продажам (роль ‘Vice President, Sales’) имеет право просматривать любые заказы.
Все остальные сотрудники доступа к заказам не имеют.
Этим правилам соответствует вот такое представление:
CREATE VIEW [Secure Orders] AS SELECT * FROM Orders where (IsUserInRole('Sales Representative') AND EmployeeID = CurrentEmployeeID()) OR (IsUserInRole('Vice President, Sales') AND TRUE) |
Здесь подразумевается, что функция CurrentEmployeeID() неким «магическим» образом возвращает идентификатор сотрудника, соответствующий пользователю, от имени которого произведено подключение. Реализация этой функции, как и функции IsUserInRole(), зависит от используемой СУБД. Обратите внимание на вторую часть предиката: для директора по продажам никаких дополнительных ограничений не предусмотрено, но для общности мы использовали выражение TRUE для представления этого факта. При подготовке предиката вручную фрагмент AND TRUE можно опустить, хотя оптимизаторы, используемые в современных СУБД, достаточно интеллектуальны, чтобы выбросить избыточные выражения из плана запроса.
СОВЕТ Иногда предикат безопасности может оказаться настолько сложным, что оптимизатор СУБД не сможет самостоятельно построить оптимальный план выполнения запроса. В таких случаях может потребоваться ручное преобразование выражения предиката в более адекватную форму. Пока что мы будем считать, что оптимизатор идеален, и все выражения будут представлены в наиболее удобном для чтения виде. |