首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >确定查询中每个对象的用户权限?

确定查询中每个对象的用户权限?
EN

Stack Overflow用户
提问于 2016-06-07 16:25:03
回答 1查看 480关注 0票数 1

我们正在设计一个协作软件db结构并使用平均堆栈,而我缺乏ACL权限的经验引发了这个问题。

高层次,该软件是为合作者和审核员工作/查看任务的项目。

MongoDB中的“Project”实体/表用于管理ACL组。每个项目都有一个用户指针的“合作者”数组和一个用户指针的“Auditor”数组。将协作者数组中的用户添加到具有读/写访问权限的项目协作者ACL组中,并将审计员数组中的用户添加到项目审计师acl组中,acl组具有只读功能。

在MongoDB中有另一个名为“任务”的实体,每个任务都绑定到一个项目,而且只有一个项目。一个项目可以有多个任务。任务的项目协作ACL组和Auditor组添加到其中。

所以一切都很好。现在,用户Bob是项目A的协作者和项目B的审计师。如果Bob查询数据库中的任务,他将返回他可以读写的任务(项目A)和他只能读取的任务(项目B)。但是前端是如何知道哪些任务具有写权限,哪些任务是他只读的?因为前端只需要显示“编辑”按钮旁边的任务,用户有写的权限。

我在ACL权限中看到,我可以执行一个调用,以检查用户是否对单个对象具有写权限,但这是每个对象的,而且性能会限制每个对象执行额外的调用,即使在发送初始查询响应之前在服务器上执行。

我是否可以使用“和当前用户权限包含写”之类的过滤器在mongo中查询Task实体组?或者应该如何处理呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-07 21:24:46

拥有这样的projectACL:

代码语言:javascript
运行
复制
projectAcl{
    id:1,
    projectId:1,        

    // those subDocuments can be also a groupId and reference for exteral document
    auditors:[{userNAme:"John", userId:2},{userNAme:"Marry", userId:12}], 
    colaborators:[{userNAme:"Anna", userId:3},{userNAme:"Eric", userId:4}]
}

然后,当调用对象时,服务器端代码需要应用“有效权限”。

代码语言:javascript
运行
复制
task{
    id:23,
    projectId:1,
    /*
    all fields needed here
    */
    // and here we have fields aded in serwerSide code
    readOnly:null //
}

readOnly -如果我们在acl列表中有一个条目,将被调用为一个快速检查。

下面的聚合使用ACL列表列出给定用户的所有项目--这对于使用CQRS模式设置任务/项目权限或添加额外的层安全性非常有用。

代码语言:javascript
运行
复制
var givenUserId = 4;
var matchArraysByUser = {
    $match : {
        $or : [{
                "auditors.userId" : givenUserId
            }, {
                "colaborators.userId" : givenUserId
            }
        ]
    }
}

var filterArrysByUser = {
    $project : {
        _id : 0,
        projectId : 1, //all needed fields set to 1
        colaborator : {
            $filter : {
                input : "$colaborators",
                as : "colaborator",
                cond : {
                    $eq : ["$$colaborator.userId", givenUserId]
                }
            }
        },

        auditor : {
            $filter : {
                input : "$auditors",
                as : "auditor",
                cond : {
                    $eq : ["$$auditor.userId", givenUserId]
                }
            }
        },
    }
}

var group = {
    $group : {
        _id : givenUserId,
        "auditor" : {
            $addToSet : {
                $cond : {
                    if  : {
                        $ne : ["$auditor", []]
                    },
                then : "$projectId",
                else  : null
            }
        }
    },
    "colaborator" : {
        $addToSet : {
            $cond : {
                if  : {
                    $ne : ["$colaborator", []]
                },
            then : "$projectId",
            else  : null
        }
    }
}}}

db.projAcl.aggregate([matchArraysByUser, filterArrysByUser, group])

产出:

代码语言:javascript
运行
复制
{
    "_id" : 4.0,
    "auditor" : [ 
        null, 
        2.0
    ],
    "colaborator" : [ 
        1.0, 
        null
    ]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37684586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档