如何为组织的用户设置名称空间以在Google App Engine上共享?

时间:2014-05-01 04:02:17

标签: google-app-engine

如何为组织创建命名空间并让其多个用户属于它?

我希望我的每个客户(具有多个员工/用户的组织)拥有自己的命名空间。我不想通过创建一堆不同的子域并以这种方式映射命名空间来实现这一点。

我也不希望每个用户都有一个单独的命名空间 - 组织中的每个用户都需要在同一个命名空间中工作。这会破坏Google的文档中推荐的以下代码:

def namespace_manager_default_namespace_for_request():
    # assumes the user is logged in.
    return users.get_current_user().user_id()

当客户首次注册时,我希望他们的用户模型属于他们公司的名称空间。当第一个用户添加其他用户时,我希望他们属于同一公司的名称空间。

我的问题是,如果所有用户都属于公司的名称空间,我的登录功能都无法使用,这也不会知道用户的登录信息是隐藏的在特定的命名空间中。

我应该如何重新处理这种情况?我使用Python,但如果需要,可以翻译你的Java答案。

修改

相反,我已经设置了所有模型处理以拥有租户模型祖先。

我将密钥的标识符设置为使用注册用户的电子邮件生成的tenant_id:

ndb.Key('Tenant', tenant_id)

并要求所有实体put()调用将此键作为父键:

def tenant_key(tenant_id):
    """Constructs a Datastore key for a Tenant entity with tenant_id."""
    return ndb.Key('Tenant', tenant_id)

    ....

class Calendar(ndb.Model):
    title = ndb.StringProperty()


    @classmethod
    def put_from_message(cls, calendar):
        # calendar represents a protoRPC message representing this entity's model

        # note: cls is the conventional "self" call for classes
        entity = cls(parent=tenant_key(calendar.tenant_id), title=calendar.title)
        entity.put()

1 个答案:

答案 0 :(得分:1)

杰伊 - 我一直试图找出这个确切的问题。当您有独立用户有时共享命名空间时,我不认为通过appengine_config.py全局设置命名空间是可能的。文档中提供的三个选项都假定共享命名空间中的用户或用户的某些属性是常见的,例如域。使用appengine_config.py要求在登录时知道共享属性。

这些是我考虑过的工作:要求用户使用组织名称及其用户名登录,并使用组织名称通过app_config设置名称空间;强迫您的用户拥有Google帐户;在用户登录初始化命名空间中的复制用户帐户并在处理程序中设置命名空间或不使用命名空间之后,不要全局设置命名空间。

第一个不是很好的用户体验,但有效。如果您正在制作商业应用,那么第二个就是灾难。第三种方法具有很大的错误可能性,具体取决于应用的复杂程度。由于我的用户群很小而且我想拥有干净的用户体验,所以我决定不使用名称空间。但也许拥有更多经验的人有比我更好的解决方案。