猿问

AppEngine 的 datastore.Get() 是否不验证所请求密钥的命名空间?

我在 go-appengine 的数据存储中使用命名空间,大致如下:


func getThing() *Thing {

  nctx := appengine.Namespace(ctx, "whatever")


  thing := Thing{}

  key, err := datastore.Get(nctx, key, &thing)

  if err != nil {

    return nil, err

  }

  return thing, nil

}

够简单了吧?不幸的是,如果事实证明如果 nctx 的命名空间与键的命名空间不匹配,它无论如何都会很高兴地获取该对象。AFAICT,没有办法手动获取密钥的“命名空间”字段以手动验证它。这对我们的应用很重要,因为我们有来自 Web 客户端的密钥,在某些极端情况下,这些密钥可能与错误的命名空间相关联。


OTOH,如果我使用的键作为祖先进行查询Thing,数据存储(适当地)返回错误,因为祖先的命名空间与上下文(形式query namespace is 'bar' but ancestor namespace is 'foo')的命名空间不匹配。


我是否遗漏了一些关于数据存储提取/查询和命名空间的预期约束,或者这听起来像是一个错误?


慕森王
浏览 212回答 1
1回答

鸿蒙传说

我假设您正在传递编码的密钥,而不仅仅是它们的 ID?如果您使用创建键,datastore.NewKey则传递给它的上下文将设置键的命名空间(除非还有父项,在这种情况下将使用其命名空间)。就意图而言,此行为等效于 python API - 在 上设置不同的命名空间时,可以获取从 urlsafe 字符串创建的密钥namespace_mananger,但如果您仅通过指定创建密钥,则使用当前设置的命名空间种类和身份。不过,为命名空间设置一个 getter 会很好,所以您至少可以在反序列化后进行验证...
随时随地看视频慕课网APP

相关分类

Go
我要回答