我以为我明白这里发生了什么。但是,显然不是。如果我设置这样的权限,则没有人收到已发布的数据。
{
"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);
谢谢, 斯科特
答案 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
这应该只是结束你上面的所有问题。如果我错过了什么,请告诉我。