详解Azure SQL数据库行级安全

微软已经在Azure SQL数据库推出了预览版行级安全性(RLS)。行级安全性使客户能够根据执行查询的用户特征(用户组成员属性或执行环境)对数据库表启用访问控制。

本文将介绍如何实现RLS。这个简单的示例扩展了微软RLS在线文档。这个例子可以帮助用户理解它的基本概念。更详细信息请参见微软开发者网络网站中关于创建安全策略的文档。

首先,我们将在Azure SQL数据库中创建一些表,并且添加一些数据。我们将创建一个“Order”(订单)表和“Mapper”(映射器)表(如图1所示)。Mapper表的作用是将特定类型的订单与特定的用户相关联。

详解Azure SQL数据库行级安全

图1:Order(订单)与Mapper(映射器)表

接下来,我们将创建几个用户,然后给他们分配读取这些表的访问权限(如图2所示)。

详解Azure SQL数据库行级安全

图2:给用户分配表的访问权限

我 们将在一个单独的模式中创建一个内联表赋值函数(如图3所示)。如果表中附加的安全字段(这里是“User”)与规定的USER_NAME相同,或者 USER_NAME为特定的用户名“Manager”,那么这个函数将返回“True”。注意,我们定义了一个泛型条件,它没有引用一个具体的表。

详解Azure SQL数据库行级安全

图3:内联表赋值函数

接 下来,我们将新建一条安全策略,它使用前面创建的函数,并且将这个过滤器添加到Mapper表上(如图4所示)。命令中的“STATE = ON”的作用就是启用这个安全策略。在这段代码中,这个策略将应用于一个指定的表上。如果有多个表(这里使用了“User”字段)使用了相同的过滤条件, 那么它们都会受到同一个策略影响。最好的做法是将函数和策略保存在不同的模式中,一是为了组织方便的考虑,二是限制用户在安全环境中所能看到的数据。

详解Azure SQL数据库行级安全

图4:创建一条安全策略

我们来测试一下。(如图5所示)。

详解Azure SQL数据库行级安全

图5:运行这个安全策略

现在,我们禁用这个安全策略。这实际上会禁用这个表的RLS。第一个SELECT *语句将会返回所有行,因为这时策略已经禁用。再执行第二个语句只会返回头信息(如图6所示)。

详解Azure SQL数据库行级安全

图6:禁用安全策略

在我们创建的Order表中,可以增加一个User字段,但是我们想利用Mapper表中已有的数据。所以,如果联合这两个表,那么结果就是经过过滤的(如图7所示)。另外,还可以尝试查询“Sales2”和“Manager”。

详解Azure SQL数据库行级安全

图7:联合Order和Mapper表

这种方法的主要问题是,它要求修改应用程序代码才能保证将Order表与Mapper表联合。如果不联合Order和Mapper表,我们就不能使用RLS。为了避免这个问题,下一步就是添加一个视图,从Order和Mapper表中选择一些行(如图8所示)。

详解Azure SQL数据库行级安全

图8:添加一个视图

我们现在可以使用一个视图来替代RLS的表格(如图9所示)。它同样适用于Sales2和Manager用户。

详解Azure SQL数据库行级安全

图9:使用一个视图

在启用RLS的过程中,与联合Mapper表相比,使用视图在编码上会更自然一些。然而,使用视图替代表的一般做法也同样适用。

在这一点上,显然RLS仍然需要很多的工作。当然,这种实现需要一定的工作;然而,上面介绍的视图方法很可能是我们应该考虑的首选方法。微软的RLS实现还提供了另一个更高效的方法。

接下来,我们将基于“辅助”表来建立安全性(如图10所示)。这时,辅助表就是Mapper表。我们要根据这个表来创建一个安全函数。

详解Azure SQL数据库行级安全

图10:使用Mapper表来创建安全性

然后,我们通过策略来将这个安全函数应用到Order表中(如图11所示)。

详解Azure SQL数据库行级安全

图11:将一个安全函数应用到Order表上

在实现RLS及相应的安全函数和策略之后,我们就可以在不需要视图的前提下查询Order表。换而言之,即使不直接联合Order表和Mapper表,我们仍然能够使用RLS安全性。(www.lelingmenhu.com )  

详解Azure SQL数据库行级安全

图12:在不使用视图的前提下查询Order表

你可能感兴趣的:(sql)