Sql Server 2016新功能之Row-Level Security
什么是Row-Level Security?
在传统的数据库访问安全控制中,只能根据用户的身份和权限来进行安全控制,但是无法对每行数据进行细粒度的控制,也就是无法针对不同用户对同一张表的不同行数据进行控制,这就是传统数据库安全控制所无法解决的问题。而Row-Level Security (RLS),就是在数据库中实现了对每行数据进行细粒度的访问控制的功能。
如何使用Row-Level Security?
1. 创建安全谓词
创建安全谓词需要使用到Sql Server 2016提供的内置函数,例如User_Name()、Session_User()等,语法如下:
CREATE FUNCTION securitypredicate(@SalespersonID AS int)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS [SecurityFilter]
WHERE @SalespersonID = CONVERT(int, Session_User);
以上安全谓词的意思是只有当Session_User的值等于SalespersonID时,才可以查询到相关数据。在创建安全谓词的时候需要注意以下几点:首先,返回的表只有一列,列名必须为SecurityFilter,并且数据类型必须为bit类型,返回值只能为1或0;其次,安全谓词必须绑定到表上,也就是需要使用WITH SCHEMABINDING选项创建函数;最后,安全谓词必须是不可计算的,也就是不能包含类似SUM()或AVG()等可计算的函数。
2. 创建安全策略
创建安全策略需要使用到Sql Server 2016提供的内置系统存储过程,语法如下:
CREATE SECURITY POLICY SalesForceFilterPolicy
ADD FILTER PREDICATE dbo.securitypredicate(SalesPersonID)
ON dbo.Sales
WITH (STATE=ON);
以上安全策略的意思是针对Sales表创建一个安全策略SalesForceFilterPolicy,在Sales表上添加一个过滤器,此过滤器调用前面创建好的安全谓词dbo.securitypredicate(SalesPersonID),表示只有当该谓词返回值为1时,才可以查询表Sales的数据,适用于所有的DML操作(INSERT、SELECT、UPDATE、DELETE)。上面的Security Policy中,STATE=ON代表启用策略。
3. 测试安全策略
测试安全策略的方法非常简单,只需要在不同的用户下,执行相关的DML操作,就可以验证是否生效,方法如下:
EXECUTE AS USER = 'Alex';
SELECT * FROM Sales;
在用户Alex下执行查看Sales表的操作,如果该用户的Session_User等于SalesPersonID,且SalesForceFilterPolicy策略启用,则可以看到该用户的数据,否则不能看到数据。
EXECUTE AS USER = 'Betty';
SELECT * FROM Sales;
在用户Betty下执行查看Sales表的操作,同样必须满足Session_User等于SalesPersonID,并且SalesForceFilterPolicy策略启用,才能看到数据,否则不能看到数据。
通过以上的操作流程,可以实现Row-Level Security的数据访问控制,提高了数据库安全性,可以更好地满足企业的安全需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Sql Server 2016新功能之Row-Level Security(值得关注) - Python技术站