免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1105 | 回复: 0
打印 上一主题 下一主题

[MongoDB] MongoDB权限验证流程–基本请求 [复制链接]

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-01-25 18:26 |只看该作者 |倒序浏览
上篇文章说到,MongoDB的网络通讯协议流程。拿到请求对象后,会调用assemblyResonse函数处理。这部分的代码实在没什么章法可言,if-else遍地,实在不怎么优雅。可以感受到随着需求的增长,很多代码都是硬套上去的。本篇介绍的是基本的处理请求,基本请求所指的是command命令以外的处理行为。

assembleResponse

首先,获取到线程绑定(ThreadLocal)Client对象,并对权限模块初始化,更新Auth Cache中过期或者失效的权限信息。然后,根据配置记录diaglog;接着统计操作计数器。接着,调用receivedXXXX函数,执行相关请求,其间会对权限进行判断。最后,根据slowlog配置,记录Profiling数据。

Query为例:

try {
    ...
    Status status = client->getAuthorizationSession()->checkAuthForQuery(ns, q.query);
    audit::logQueryAuthzCheck(client, ns, q.query, status.code());
    uassertStatusOK(status);
    ...
catch (AssertionException& e) {
    ...
    ok = false;
}
checkAuthForQuery之后会调用isAuthorizedForActionsOnNamespace做具体的验证功能:

if (!isAuthorizedForActionsOnNamespace(ns, ActionType::find)) {
    return Status(ErrorCodes::Unauthorized,
        str::stream() << "not authorized for query on " << ns.ns());
}
isAuthorizedForActionsOnNamespace函数用来验证资源和动作的权限合法性,不同的操作都对应自己的一套动作,相关的对应关系总结如下:

OP_CODE        VALUE        RECEIVEDXXXX        CHECKAUTHFORXXXX        ACTIONTYPE
OP_UPDATE        2001        receivedUpdate        checkAuthForUpdate        update
OP_INSERT        2002        receivedInsert        checkAuthForInsert        createIndex/insert
OP_QUERY        2004        receivedQuery        checkAuthForQuery        find
OP_GET_MORE        2005        receivedGetMore        checkAuthForGetMore        listCollections/listIndexes/find
OP_DELETE        2006        receivedDelete        checkAuthForDelete        remove
OP_KILL_CURSORS        2007        receivedKillCursors        checkAuthForKillCursors        killCursors
PS:

2003操作代码已经废弃,目前是保留字段
command请求也是通过OP_QUERY发送过来的,对于command请求,代码上分之处理,个人不是很喜欢这个混用OP_CODE的风格,也许是伟大的历史原因造成的
inprog killop unlock 不走以上流程,通过Query包封装传递过来后,调用了相应的处理函数处理
command的权限验证额外说明
所有的ActionType定义在db/auth/action_types.txt中,非常多
isAuthorizedForActionsOnNamespace

主要对Action和Resource封装,然后调用_isAuthorizedForPrivilege完成功能。

简单介绍下Privilege,Action就是对数据的操作,比如Query,Insert都可以归纳为Action;Resource就是数据集合,可以是Collection,也可以是DB,那Privilege就是Action*Privilege的组合,一个Privilege可以含有多个Action,但在Privilege维度上,Action都只能与一个(或者表达式)Resource组合。Privilege的集合可以组合成Role概念,方便用户配置。

这个函数的处理算法是,遍历授权过的所有用户,和待验证的Resource比较,如果找到,则对比Action,所有的Action都找到的话,则通过验证。

for (UserSet::iterator it = _authenticatedUsers.begin();
        it != _authenticatedUsers.end(); ++it) {
    User* user = *it;
    for (int i = 0; i getActionsForResource(resourceSearchList);
        unmetRequirements.removeAllActionsFromSet(userActions);
        if (unmetRequirements.empty())
            return true;
    }
}
下一篇介绍Command系列的权限是如何验证的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP