分类目录归档:开发文档

将数据安全捍卫到底:权限管理(ACL)文档全新发布

随着使用 LeanCloud 的开发者越来越多,大家慢慢注意到一些在开发初期容易被忽视的漏洞,其中最容易被忽略但在我们的文档中又占据了重要地位的内容就是:权限管理(ACL)的使用。

ACL 全称为 Access Control List,维基百科解释为:

存取控制串列,是使用以访问控制矩阵为基础的访问控制方法,每一个对象对应一个串列主体。访问控制表描述每一个对象各自的访问控制,并记录可对此对象进行访问的所有主体对象的权限。

等等,这个听上去怎么一阵头晕,这跟我的应用数据安全到底有什么关系?先别着急,我们当然不会用这么晦涩的语言来讲解 ACL,来看下面的例子:

公司的保险柜只有财务人员才能打开,那么对于保险柜来说,其 ACL 可以表示为:

{
    "role:finance": {
        "access": true
    }
}

即只有角色(role)为 财务(finance)的员工才有打开保险柜的权限(access = true)。

继续阅读

「人生苦短,我用 Python」LeanCloud Python SDK 1.0.0 正式发布

以往在服务端环境中基于 LeanCloud 进行开发,只能选择使用 JavaScript-SDK,或者直接使用 RESTful API 来进行开发。现在我们正式发布了 LeanCloud Python SDK,您可以使用 Python 语言来进行项目开发。

目前 LeanCloud Python SDK 只支持 Python 2.x,请确保您的环境满足需求。我们推荐您使用 pip 或者 easy_install 来安装 Python SDK,只要执行:

pip install leancloud-sdk

或者

easy_install leancloud-sdk

即可进行安装。根据您的操作系统环境不同,您可能需要在上述命令之前加上 sudo 。

安装结束后,我们就可以进行开发了。打开 Python 交互式解释器,输入 import leancloud ,就可以进行下一步开发了。接下来我们需要做的是使用 Application Id 与 Application Key 对应用进行初始化:

import leancloud

leancloud.init('your application id', 'your application key')

之后假设我们想实现一个简易的博客系统的话,我们需要有如下两个用于存储的 class:Post, Comment。我们可以直接使用 leancloud.Object.extend 方法来创建 class,或者直接从 leancloud.Object 继承一个子类,这样就可以创建与 LeanCloud 数据存储对应的 Class 了:

import leancloud
from leancloud import Object
from leancloud import LeanCloudError

Post = Object.extend('Post')

# 然后可以直接像一个正常 Python 类一样使用 Post 和 Comment 来创建对象了
my_post = Post(title="Hello LeanBlog!", content="Life is short, use Python!")

# 除了在创建对象的时候进行初始化数据之外,我们还可以使用 set 方法来对对象进行赋值
my_post.set('title', 'First Blog on LeanBlog')

# 我们可以使用 get 方法来获取 Object 对象上的值
my_post.get('content')  # => "Life is short, use Python!"

# 我们可以直接调用 save 方法来将对象保存到 LeanCloud 服务器上(不需要回调函数,吔!)
try:
    my_post.save()
except LeanCloudError:
    do_something_to_handle_error()

同样的方式,我们可以创建一个 Comment 对象,填充数据,并且将一个 Post 作为一对多的关系添加进来:

Comment = Object.extend('Comment')

my_comment = Comment()
my_comment.set('content', 'Hello World!')
my_comment.set('post', my_post)
try:
    my_comment.save()
except LeanCloudError:
    do_something_to_handle_error()

使用 leancloud.Query 可以从 LeanCloud 上查询已经存在的数据:

from leancloud import Query

# 构造一个 Query 对象
query = Query(Post)
# 调用 find 方法,即可获取最多一百条的 Post
posts = query.find()
for post in posts:
    show_post(post)

# 另外我们还可以直接使用字符串来构造 Query 对象
query = Query('Comment')
# 直接根据 id 来查询 Comment
query.get(comment_id)

大概的介绍就到这里,详细文档可以参考 这里API doc。您可以使用任意自己喜欢的 Python Web 开发框架来配合 LeanCloud Python SDK 来进行开发。另外 LeanCloud 云代码也即将支持 Python 运行环境,到时候您就可以直接将您的代码部署到我们的服务器上来了。

另外如果您使用上遇到任何问题,可以直接在 github 上开源的仓库 中提交 issue,或者在我们的 工单系统 上反馈问题。

更 lean 更便捷,云代码「精益模式」上线

很多用户使用 Cloud Code 云代码 是为了在服务端提供一些个性化的方法供各终端调用,而不希望关心诸如代码托管、npm 依赖管理等问题。为此我们提供了在线维护 Cloud Code 的功能。

提醒

使用此功能,你需要注意:

  • 会替代您之前 git 或者命令行部署的项目。
  • 暂不提供 Web hosting 功能。
  • 维护的所有函数可以生成并导出一个完整的项目,供 git 或命令行部署(即将推出)。
  • 之前由项目维护的云代码方法并不会显示在此处,可以认为「定义函数」和使用项目维护的云代码是两套代码。具体使用什么代码,是由最后一次部署使用什么功能决定(「定义函数」的每一个添加、修改、发布、删除动作都是一个部署动作)。

cloud_code_snippet

左上角的「创建函数」可以新创建一个函数。中间部分是已经创建好的函数,并可以进行一些维护操作。

函数类型

有几种函数类型:

  • Function:对应 AV.Cloud.define 定义的方法。
  • Hook:对应 AV.Cloud.beforeSave 等回调定义的方法。
  • Global:对应全局变量,一些全局变量和公共函数可以定义在这里。

这些函数的使用场景和具体细节,参见:Cloud 函数

创建函数

如果需要创建一个新的函数,可以点击「创建函数」按钮,您将看到如下窗口:

cloud_code_snippet_create

您需要设置的部分包括:

  • 函数类型
  • 函数名称
  • 数据具体的代码片段(注意,你不需要输入函数定义部分,即 AV.Cloud.define(...) 部分)
  • 注释
  • 全部 OK 后点击「保存」,或者放弃编辑点击「关闭」

您可以在代码框中填入下列代码:

var name = request.params.name;
if (name) {
    response.success('Hello ' + name);
} else {
    response.error('name?')
}

点击保存后,Cloud Code 会在后台编译、保存,并将代码部署到「测试环境」,这个过程可能需要十几秒钟的时间,请耐心等待。全部完成后,页面上方会提示「已更新到测试环境」;如果有错误(比如编译错误)则会出现类似提示: 加载代码出错: SyntaxError: Unexpected token )

发布

如果函数部署「测试环境」成功,就可以点击「发布」按钮将函数发布到「生产环境」。同样该过程可能需要十几秒钟的时间,请耐心等待。全部完成后,页面上方会提示「已发布到生产环境」。

同步

对于某个函数,可能生产环境运行一个版本,而测试环境正在开发一个新的版本,两个环境的代码是不一致的,这时函数列表页面相关函数的「测试环境」按钮会变成蓝色:

cloud_code_snippet_diff_version

当您在测试环境开发完成,点击「发布」后,两个环境的代码将会统一,这时「测试环境」按钮变为灰色。

测试

如果需要测试,可以点击相应函数的「调用」按钮,你将看到如下窗口:

cloud_code_snippet_invoke

选择调用环境,并输入调用参数,点击「运行」按钮即可看到调用结果。如果调用返回的 Http Status Code 不是 200,则页面上方会提示相关错误信息。

历史版本

如果您想看某个函数之前曾经部署过的代码,可以在函数列表页面点击「历史」按钮,将会弹出类似下面的窗口:

cloud_code_snippet_history

您可以点击时间来查看不同时间部署的代码。

删除

如果您确定某个函数已经不再需要,可以在函数列表页面点击「删除」按钮将其删除。 注意 :删除后该函数和其所有历史记录都将被删除,而且不能恢复。删除动作会重新部署测试和生产环境,这个过程可能需要十几秒钟的时间,请耐心等待。

AVOS Cloud SDK for Windows Desktop beta 悄然上线

经过 5 个月在微软阵营的探索,先后发布了 Unity SDK(纯 C# 语言打造的跨平台 SDK),Windows Phone 8 SDK 等用 C#语言构建的客户端 SDK 之后,根据开发者的强烈需求, AVOS Cloud 正式在 Nuget 平台上发布了 AVOS Cloud SDK for Windows Desktop(.NET 4.5)beta 版本,广大微软阵营的开发者可以利用此版本开发很多很有意思的应用程序,甚至可以把它当做 Azure SQL Server 的替代品,可以在 ASP.NET 以及 ASP.NET MVC 中引用 AVOS Cloud 作为「云数据库」 的不二之选,与此同时我们还将为 Desktop 版本进行一系列的个性化开发,以满足广大「云服务依赖综合征」 开发者的各种需求。

电梯直达:

10 分钟为你的 App 加入实时通讯功能

很多开发者想在自己的 App 中添加实时通讯的功能,但通常因为没有合适的后端支持,最终没能实现。而 AVOSCloud 与时俱进,给大家带来了希望。下面就来介绍使用 AVOSCloud 给自己的 App 添加实时通讯功能。

AVOSCloud SDK 从 2.5.9 开始提供了实时通讯模块。本文主要基于 iOS SDK 2.6.2.1 实现,假设你已经具有一定的 iOS 开发基础,省略掉非实时通讯相关的代码,github 完整代码点此

概念

  • peerId
    唯一表示一个用户的标识,可以是用户名、用户 ID 或设备 ID 等等跟用户关联的东西
  • Session
    表示一个会话,处理底层网络连接,收发消息
  • Message
    消息,可以自己定义格式,如文本或 JSON 等,从而达到实现不同类型消息的目的
  • Signature
    签名,用于验证消息合法性
  • Group
    群组,一个用户集合的抽象,给一个群组发送消息,群组里面所有的人都将收到此消息

实现

此部分只列出了通讯相关的代码,省略了一些本地对话和消息保存的代码。完整代码可以查看 github 完整代码

继续阅读

基于 AVOS Cloud 的一对多、多对多数据建模

产品需求

demo (1)

假设有一个类似于 Instagram 的产品,核心的数据类型可能包括:用户(User),图片(Image),评论(Comment),点赞(Like)。他们之间的关系如下:

  • 对于每张图片(Image),有一个 publisher,是一个 User 对象的实例;
  • 每张图片,可能会有很多 Comment,每条 Comment 会包含一段文字说明和一个 Creator(也是一个 User 对象的实例);
  • 每张图片还会有很多人点赞(Like),我们可以根据图片找到所有点赞的人,也可以根据人找到他所有赞过的图片。

对于这样的模型,在 MySQL 中我们能很容易地通过主键、外键建立关联,但在 AVOS Cloud 里面如何表现出来呢?下面我会为大家仔细说明一下如何处理这种复杂的数据建模。

继续阅读

使用 AVOS Cloud JavaScript SDK 和 AngularJS 创建 一个 Todo Demo

为什么选择这两个库做 Todo

AVOS Cloud JavaScript SDK 负责把数据存储在服务器,提供了 数据查询,保存,更新等常用操作的方法。AngularJS 对于增删改查类型的应用场景非常合适。这块主要用到了 AngularJS 的 模板和绑定方面的特性。

Step By Step 入门

这里主要说下 AVOS cloud Javascript SDK 与 AngularJS 结合使用的部分

初始化 AVOS Cloud JavaScript SDK

AV.initialize("your app id", "your app key");

既然是与 AngularJS,这里可以有更优雅的写法,对于 angular 来说初始化可以放在 模块初始化的配置里面。

var module = angular.module("todoMod",[]);
    module.run(function() {
        AV.initialize("your app id", "your app key");
    });

保存一个对象

        var Todo = AV.Object.extend("Todo");
        var todo = new Todo();
        todo.set("text",$scope.newTodo.text);
        todo.set("done",$scope.newTodo.done)
        todo.save(null, {
            success: function(result){
                $scope.$apply(function(){//使 angular 知道数据发生了变化
                    $scope.todos.push(todo.toJSON());
                });
            }
        });

我们知道一个 AngularJs 的 model 是一个 plain JavaScript Object,对于 AV Object, 需要用 set 来设置属性。注意 AV Object 并不是一个 key,value 的值组合,比如有 todo.save() 方法,所以不能 todo[prop] 这样获取属性。需要走 setter,getter 方式。还有其他更优雅的结合方式 下面再说。

这里还有一点需要注意,就是 $scope.$apply 这一行,因为数据的保存请求是通过 AV Object 进行的,所以 angular 并不知道发送了什么,需要告知 angular todo 数据发生了变化。

todo.toJSON()todo 是一个 AVObject 类型实例,需要转换成 angular 需要的数据格式。

查询 Todo 列表

        var Todo = AV.Object.extend("Todo");
        var query = new AV.Query(Todo);
        query.find({
            success:function (results){
                $scope.$apply(function(){
                    $scope.todos = JSON.parse(JSON.stringify(results));
                })
            }
        })

这里需要注意 JSON.parse(JSON.stringify(results)), results 是一个普通的 js Array,但里面的元素都是 AVObject 类型的实例,需要转化成 angular 需要的数据格式。

一个简单的模型就建立起来了

查看源码 ,下载下来直接打开 index.html 就可以看到效果了。

通过 AVOS Cloud 数据管理平台查看,管理数据。需要创建一个自己的 应用 ,并在初始化的时候 替换掉 AV.initialize 里的 AppId AppKey

关于 AV Object 数据与 Angular 的转化。

除了通过 JSON 方式,还可以用

Object.defineProperty(Todo.prototype, "title", {
      get: function() {
        return this.get("text");
      },
      set: function(aValue) {
        this.set("text", aValue);
      }
    });

这样可以在 html 里直接通过 {{todo.text}} 访问。

关于通知 Angular 发生变化

除了通过 $scope.$apply,还可以借助 $timeout 或者 $q 来让 Angular 感知到变化。

var query = new AV.Query(Todo);
$q.when(query.find()).then(function(todos) {
  $scope.todos = JSON.parse(JSON.stringify(results));
}, function(error) {
  // deal with error
});

结合 AVOS Cloud JS SDK 和 AngularJS 可以实现 MEAN 的全栈开发。其中 M(Mongo) E(Express) N(node) 由 AVOS Cloud 完成。