将发布的数据限制为公共频道

时间:2014-10-14 01:03:31

标签: pubnub pam

我以为我明白这里发生了什么。但是,显然不是。如果我设置这样的权限,则没有人收到已发布的数据。

{
    "channels": {
        "myChannel": {
            "auths": {
                "51EF3B88-3245-4CF1-B324-979F8E8A9EEF": {
                    "r": 1,
                    "w": 1
                },
                "F4EA7F64-27E3-4877-A86C-371FF7A9ABF2": {
                    "r": 1,
                    "w": 1
                }
            },
            "r": 0, // I thought this would turn OFF published data for the world
            "w": 0, // And the above auths would turn ON published data for the given keys
            "ttl": 1
        }
    },
    "subscribe_key": "my-sub-key",
    "level": "channel"
}

如果我这样设置,每个人都会获得已发布的数据。

{
    "channels": {
        "myChannel": {
            "auths": {
                "51EF3B88-3245-4CF1-B324-979F8E8A9EEF": {
                    "r": 1,
                    "w": 1
                },
                "F4EA7F64-27E3-4877-A86C-371FF7A9ABF2": {
                    "r": 1,
                    "w": 1
                }
            },
            "r": 1, // this is the difference
            "w": 1, // this is the difference
        }
    },
    "subscribe_key": "my-sub-key",
    "level": "channel"
}

我的测试客户端是Java。我有一个设置上述键之一的AuthKey。另一个是没有设置授权密钥。如果需要,我可以分享该代码。

我没有到这里来的是什么?

修改

以下是一些代码段。我正在尝试为所有用户设置公共频道,然后设置私有频道。我看到的是没有设置uuid的客户仍然可以看到已发布的数据。

服务器权限设置代码:

 pubnub = new Pubnub("myPubKey", "mySubKey", "mySecretKey");

 // the public channel
 pubnub.pamGrant("myChannel", true, true, ttl, callback);
 pubnub.pamGrant("myChannel", "F4EA7F64-27E3-4877-A86C-371FF7A9ABF2", true, true, ttl, callback);
 pubnub.pamGrant("myChannel", "51EF3B88-3245-4CF1-B324-979F8E8A9EEF", true, true, ttl, callback);

 // the private channels
 pubnub.pamGrant("F4EA7F64-27E3-4877-A86C-371FF7A9ABF2", "F4EA7F64-27E3-4877-A86C-371FF7A9ABF2", true, true, ttl, callback);
 pubnub.pamGrant("F4EA7F64-27E3-4877-A86C-371FF7A9ABF2", true, true, ttl, callback);

 pubnub.pamGrant("51EF3B88-3245-4CF1-B324-979F8E8A9EEF", "51EF3B88-3245-4CF1-B324-979F8E8A9EEF", true, true, ttl, callback);
 pubnub.pamGrant("51EF3B88-3245-4CF1-B324-979F8E8A9EEF", true, true, ttl, callback);

修改2

这是我尝试授予权限的新尝试。这是基于克雷格的帮助。

  pubnub.pamGrant(Common.channelSummaries, Common.AuthKeyApp1, true, true, Common.ttl, callback);

  // grant read and write access to AuthKeyApp1 on the channel AuthKeyApp1 
  pubnub.pamGrant(Common.AuthKeyApp1, Common.AuthKeyApp1, true, true, Common.ttl, callback);

  // grant read and write access to serverUUID on the channel AuthKeyApp1 
  pubnub.pamGrant(Common.AuthKeyApp1, Common.serverUUID, true, true, Common.ttl, callback);

  pubnub.pamGrant(Common.channelSummaries, Common.AuthKeyApp2, true, true, Common.ttl, callback);

  // grant read and write access to AuthKeyApp1 on the channel AuthKeyApp1 
  pubnub.pamGrant(Common.AuthKeyApp2, Common.AuthKeyApp2, true, true, Common.ttl, callback);

  // grant read and write access to serverUUID on the channel AuthKeyApp1 
  pubnub.pamGrant(Common.AuthKeyApp2, Common.serverUUID, true, true, Common.ttl, callback);

  // grant read and write access to serverUUID on the channel channelNameGameSummaries 
  pubnub.pamGrant(Common.channelSummaries, Common.serverUUID, true, true, Common.ttl, callback);

  // grant read and write access to serverUUID on the channel channelNameGameSummariesPresense 
  pubnub.pamGrant(Common.channelSummariesPresense, Common.serverUUID, true, true, Common.ttl, callback);

  pubnub.pamGrant("", false, false, Common.ttl, callback);

  // Set the servers UUID to serverUUID  
  pubnub.setUUID(Common.serverUUID);
  pubnub.setAuthKey(Common.serverUUID);

谢谢, 斯科特

1 个答案:

答案 0 :(得分:1)

斯科特,

我知道你已经回答了这个问题,但只是为了使这个官方,这个问题是你在频道级授予你然后授予auth-key级别。 Access Manager授权类似于CSS反向:更一般的规则覆盖更具体的规则。因此,auth-key grant特定于该auth-key,并且只有使用该auth-key初始化PubNub的用户才具有这些访问权限。

但是频道级别授权(未指定授权密钥)会向所有用户打开频道。无需auth-key。如果在特定频道上授予了true / true,那么就像您关闭了那个频道的Access Manager一样。

如果在订阅者密钥级别授予访问权限true或true,则与完全禁用Access Manager相同。除了以编程方式禁用/启用Access Manager(无论出于何种原因)之外,这通常没有用。

要从授权密钥,通道或子密钥中删除授权(换句话说,撤销它),您只需授予false / false。所以要在子密钥级别撤销。在我们的Java SDK中有revoke个方法(许多SDK只依赖grant进行错误/错误访问。

请参阅我们的文档网站上的详细信息:http://www.pubnub.com/docs/java/javase/api/reference.html#_pubnub_access_manager

这应该只是结束你上面的所有问题。如果我错过了什么,请告诉我。