0

我想创建一个行级安全策略。

我的输入是通过中间层应用程序连接到数据库的用户的 user_id。

我想:

  1. 查询一张配置表(姑且称之为conf_table)获取部门名称user_id
  2. 根据值department,我想在另一个表customers上进行过滤type_of_customers

例子:

conf_table

用户身份
多多 悉尼

顾客:

客户编号 typ_customer
0001 一个
0002

功能:

IF conf_table.user_id = 'toto' AND conf_table.department = 'sidney'`
    SELECT * 
    FROM customers 
    WHERE typ_customer = A`

ELSE 
    SELECT * 
    FROM customers 
    WHERE typ_customer = B`

非常感谢您的帮助!

4

2 回答 2

1

最简单的方法是这样做:

DECLARE @type VARCHAR(1) = 'B'

IF EXISTS(SELECT * FROM conf_table WHERE user_id = 'toto' AND department = 'sidney')
    SET @type = 'A'
    
SELECT * FROM customers WHERE typ_customer = @type
于 2021-11-20T17:05:37.147 回答
0

理想情况下,每一行都conf_table会有一个typ_customer与之关联的,或者您可以加入一个Departments表来获取该值。

但没有它,你可以只使用一个CASE表达式。

请注意函数参数的使用,以便能够从正在过滤typ_customer的表中传递值。Customers

CREATE OR ALTER FUNCTION Security.YourPredicateTVF (@typ_customer AS char(1))  
  RETURNS TABLE WITH SCHEMABINDING  
AS RETURN

SELECT 1 AS tvf_securitypredicate_result
FROM Security.conf_table c
WHERE c.user_id = USER_NAME()
  AND CASE c.department = 'sidney' THEN 'A' ELSE 'B' END = @typ_customer;

GO

然后简单地定义一个安全策略,将typ_customer列传递给函数。

CREATE SECURITY POLICY Security.YourPolicyName
    ADD FILTER PREDICATE
      Security.YourPredicateTVF (typ_customer)
      ON dbo.Customers;

您可能还想更改FILTERBLOCK/或添加 DML 过滤器,具体取决于您的用例。

请注意,行级安全性会受到侧信道攻击,因此不是一个完全安全的功能。例如,触发被零除错误可以告诉用户在一行中存储了什么,而不会实际看到它。

于 2021-11-20T19:53:43.183 回答