5

我的角色有问题Sync_gateway。我在. sync_function_missing rolerequireRole("adminSync");

我正在使用配置如下的用户 admin1 访问:

  "name": "admin1",
  "all_channels": {},
  "passwordhash_bcrypt": "**************",
  "explicit_roles": {
    "adminSync": 1
  },
  "rolesSince": {
    "adminSync": 1
  }

我也将角色配置为:

{
  "name": "adminSync",
  "admin_channels": {
    "CH_HORAS": 1,
    "CH_PERSONAS": 1,
    "CH_PROYECTOS": 1
  },
  "all_channels": {
    "CH_HORAS": 1,
    "CH_PERSONAS": 1,
    "CH_PROYECTOS": 1
  }
}

知道这个错误吗?

谢谢。

4

2 回答 2

4

我正在解决同样的问题。我查看了 sync_gateway 源代码src/channels/sync_runner.go并找到了 requireRole 定义,即:

function requireRole(roles) {
            if (!shouldValidate) return;
            roles = makeArray(roles);
            if (!anyInArray(realUserCtx.roles, roles))
                throw({forbidden: "missing role"});
    }

尽管如此,我还是尝试在我的同步函数中添加这部分代码:

console.log(Array.isArray(realUserCtx.roles));

..它返回错误。 realUserCtx.roles不是一个数组,而是一个函数,我不知道这个函数体内是什么。

我希望它可以帮助找到解决方案。

于 2014-06-09T19:31:26.050 回答
1

重新,我发现了问题所在,

变量realUserCtx.roles是一个映射,所以根据需要比较两个数组的requireRole(..),它总是返回false。

所以我需要更改 src/channels/sync_runner.go 的源代码,以便在比较之前将此映射转换为数组。

function mapToArray(mapObject){
        var _array = [];
        if(mapObject){
            for (var property in mapObject) {
                _array.push(property);
            }
        }
        return _array;
    }

然后..

function requireRole(roles) {
    ...
    if (!anyInArray(mapToArray(realUserCtx.roles), roles))
    }

如果您需要更多解释,可以私信联系我。祝你好运

于 2014-06-11T21:39:48.383 回答