【IT168 评论】MongoDB前段时间的黑客袭击事件闹得沸沸扬扬,累坏了各大营销号,有借此机会狠踩MongoDB一脚的,也有抓紧宣传自家产品的。这让我不由得想起MongoDB 3.4推出的视图功能,据说在数据安全和高级抽象上效果显著,既不使用磁盘空间也并非物理模式,所以来看看如何用吧!
视图通常在关系数据库中使用,以实现数据安全性和高级抽象,从而更易检索数据。与常规表不同,视图既不具有物理模式也不使用磁盘空间。它们执行预先指定的查询。当然也有例外(例如物化视图和预执行视图),但默认情况是引擎执行查询,然后在使用视图时将结果集作为单个表发送。
在MySQL中,一个简单的视图可以定义为:
上面的查询只显示用户和主机字段,而不是所有表字段。任何查询此视图的人都会看到一个只有用户和主机字段的表。
此功能在以前的MongoDB版本中不可用。我们可以做的是拒绝读取集合(这对用户来说是无用的)或允许读取整个集合(这就非常不安全了)。
MongoDB 3.4视图是非物化视图。创建视图需要我们指定集合或先前存在的视图。 当视图是来自另一个视图的源集合时,它允许执行链接聚合。
要创建视图,我们应该使用db.createView('view_name','source',[pipeline])命令,指定视图名称,视图源集合和聚合管道。此聚合管道以及其他参数保存在system.views集合中。这是视图在系统中使用的唯一空间。每个新创建的视图文档保存在system.views集合中。
虽然视图看起来很容易创建,但使用它们时有一些陷阱。
由于视图总是运行聚合,因此索引需要覆盖聚合$ match管道,或者在收集扫描期间可能会导致响应十分缓慢。级联聚合可能也会很慢,因为视图没有任何数据,因此无法对其进行索引。MongoDB在创建视图之前不检查收集字段。如果没有集合,则视图返回一个空值。
当我们列出它们时,视图显示为一个集合。show collections命令将我们的视图显示为一个集合,但这样的集合是只读的,注意是只读的。要删除视图,我们只需执行b.collection.drop()命令,该集合就会从system.collections中删除,但数据保持不变,因为它只删除生成视图结果的代码。
如何创建视图?
在这一步中,我们将创建一个视图,并限制用户UserReadOnly只读取权限:
1、填充集合
2、创建只显示全名的视图:
3.对不同的用户角色定义视图访问权限:
使用以下javascript创建文件“createviewOnlyRole.js”,或复制并粘贴以下代码:
4、然后验证并使用所需的数据库来创建此角色。本文案例的情况下:
5、创建分配给readAnyView角色的新用户。此新用户仅能查询视图,并且知道视图名称,但不会授予其他权限:
注意:如果尝试执行.js文件时错误,请创建一个新角色,并在system.views集合中查找:
有关用户定义角色的详细信息,请检查用户定义文档。
MongoDB相比于其它数据库而言,还很年轻,所以还可以犯错。希望未来可以越来越完善,尤其是在安全方面,作为企业经常选择的数据库,MongoDB在安全方面还有很多功课要做。