zoukankan      html  css  js  c++  java
  • 云开发的数据库权限机制解读丨云开发101

    在使用云开发进行开发时,数据库权限是一个让不少人困扰的部分,四种数据库权限,到底是什么意思?其各自的权限、应用场景都是什么?大多数人对于这个机制,还是模糊的。为了帮助大家进行更好的开发,在涉及到具体的代码之前,我们先来了解一下云开发的数据库权限机制。

    一、为什么会有权限系统?

    云开发和其他常见的开发模式有一处很大的不同就是,其数据库是可以在小程序端直接进行查询,而无需通过服务端提供的特定 API 接口来完成数据查询。这样就会出现一个问题,这个数据到底谁能查?谁不能查?能查到数据的人,能修改数据么?

    在传统的应用开发模式中,权限的控制由服务端的后端接口完成,但是,在云开发的模式中,已经不存在传统的后端,因此,我们需要将权限控制进行向前移,但前端的代码因为无法保证安全(前端的数据可能被篡改,不可信),因此,我们需要将权限控制放在一个更加安全的地方,在经过多方权衡后,最终,云开发数据库就变成了云开发控制台中的一个选项。

    二、云开发权限系统中的环境与角色

    在云开发的权限中,我们会看到一些词,比如创建者所有人管理端,这些词应该如何理解呢?

    其实这里在命名上是有一些问题的,管理端和创建者、所有人并不是一个好的对比,如果将管理端更名为管理员,会更容易理解。

    从权限的层面上来看,从管理端到创建者再到所有人,权限是依次收紧的。

    管理端,或者叫管理员,其实便是指云开发中的云函数环境的执行权限。因为是在云函数中执行,安全系数较高,因而获得了最高的权限,也就是所谓的管理端权限。这个权限包括了对于所有的数据进行增、删、改、查的能力。

    创建者,则指的是创建某条数据的用户,一般来说,是指在小程序端创建数据的用户。数据和用户之间的绑定是基于数据中的 _openid 来实现的,程序在执行中,当前用户的 openid 与数据的_openid一致时,就认为这个用户是数据的创建者。

    所有人,指的是除了管理员以外的用户,这个用户一般而言,也是指小程序端的用户。数据和用户之间并不具备直接的关联关系。用户仅能通过数据库权限配置后的开放读取到用户。

    三、关于四个不同的权限

    云开发的数据库权限共四种,分别是:
    1. 仅创建者可写,所有人可读
    2. 仅创建者可读写
    3. 仅管理端可写,其他人可读
    4. 仅管理端可读写

    这四种权限各自对应着不同的场景,接下来,我们借一些例子,来看一看四种权限的不同应用场景。

    仅创建者可写,所有人可读

    这种权限是我们使用最多的权限,特别是一些涉及到UGC的场景,我们一定会需要这个权限,因为我们的需求是产生的内容所有人均可读,写的层面则允许数据的创建者可写。

    举个例子,如果你做了一个类似朋友圈的应用,那么你一定希望你的用户发的朋友圈可以被其他用户看到,但不能被其他用户修改,不然就乱套了。

    仅创建者可读写

    这种权限一般应用在一些用户的个人隐私信息的场景中。这些信息希望用户自己可以读取,但其他用户无法读取,此时,我们便需要仅创建者可读写。

    举个例子,如果你做了个人相册的功能,那么你一定希望这个相册是只有你自己能看,而不是被所有人可以看到,因此,你需要选择仅创建者可读写,而不是仅创建者可写,所有人可读。

    仅管理端可写,其他人可读

    如果描述这个权限的特性,那么就是管理员可以修改,其他人只能看。最适合的场景莫过于各种需要由开发者、平台方管控的东西,比如新闻应用的轮播图列表、商城首页的活动信息等等。这些数据的关键在于所有人都可以看到,同时,所有人也只能看到,不能修改,只能有管理员修改。

    举个例子,如果你做了一个电商小程序,那么在你的小程序中,你一定希望首页的推广 Banner 由你自己控制,而不是由用户自行控制,基于这样的考虑,你就需要仅管理端可写,其他人可读的权限。

    仅管理端可读写

    仅管理端可读写,你可以理解为只有云函数中有资格获取这个数据,其他的环境均不允许。这个权限在某些特定的场景下非常有用,举个例子,你的小程序的一些运行日志,你希望在云端可以查看,同时,这个日志不对普通用户展现,这个时候就可以设置为仅管理端可读写。

    举个例子,如果你做了一个电商小程序,那么内部的统计数据就需要设置为仅管理端可读写,这样可以确保你的运营数据不会被普通用户所读取,尽可能避免信息的泄露。

    四、常见问题

    为什么没有所有人可读写的权限?

    所有人可读写的数据库应用场景并不多见,而且大多数时候、可以通过管理端完成绕过。不过,如果你真的有了这样的场景,不妨思考一下,你的需求到底是什么?是不是因为你的数据库结构的不合理导致的需要所有人可读写?

    所有人可读写数据会造成非常多的问题,比如数据原子化、数据锁等问题,因此,在你实现数据所有人可读写时,一定要考虑场景。

    能不能实现更加细粒度的权限控制呢?

    当然是可以的,实际上,云开发的数据库中每一条由小程序段完成添加的数据都有一个字段 _openid,我们在进行数据库查询时,系统会自动替我们完成这个字段的对比,如果对比不上,再去查询对应集合的权限控制,看是否给予了非创建者可读写的权限。

    你自己在实现时,可以在数据创建时,根据业务需求,在数据中加入对应的字段,然后数据查询时,基于字段中的条件进行对比。

    如果你对于云开发有任何问题,都欢迎你在文章留言出留下你的疑问,我们将一一解答。

    云开发(CloudBase)是一款云端一体化的产品方案 ,采用 serverless 架构,免环境搭建等运维事务 ,支持一云多端,助力快速构建小程序、Web应用、移动应用。

    技术文档:https://www.cloudbase.net/

    如果你想要了解更多关于云开发CloudBase相关的技术故事/技术实战经验,请扫码关注【腾讯云云开发】公众号~

  • 相关阅读:
    Leetcode 191.位1的个数 By Python
    反向传播的推导
    Leetcode 268.缺失数字 By Python
    Leetcode 326.3的幂 By Python
    Leetcode 28.实现strStr() By Python
    Leetcode 7.反转整数 By Python
    Leetcode 125.验证回文串 By Python
    Leetcode 1.两数之和 By Python
    Hdoj 1008.Elevator 题解
    TZOJ 车辆拥挤相互往里走
  • 原文地址:https://www.cnblogs.com/CloudBase/p/11533994.html
Copyright © 2011-2022 走看看