通过 _users 数据库管理 Cloudant 访问

Posted

技术标签:

【中文标题】通过 _users 数据库管理 Cloudant 访问【英文标题】:Managing Cloudant access through _users database 【发布时间】:2016-01-14 02:54:01 【问题描述】:

我已经创建了_users 数据库以及_security 文档,并根据https://cloudant.com/for-developers/faq/auth/ 适当地设置了安全性。

然后,我创建了一个角色为“_reader”的用户“test”,但是当我尝试登录 Cloudant 时,它无法识别该用户。

_users 数据库包含一个文档:


  "_id": "test",
  "_rev": "1-96973497bc9c89989c4beed02e3f0b96",
  "name": "test",
  "roles": [
    "_reader"
  ],
  "type": "user",
  "password": "password"

然后我尝试使用上面创建的用户名“test”和密码“password”查看设计文档,但它不起作用。

在设计文档所在的数据库的安全文档中,我有:

 "couchdb_auth_only": true, "members":  "names": [ "test" ], "roles": [ "_reader" ]  

有什么建议吗?

谢谢!

【问题讨论】:

你看过这个帖子吗:***.com/questions/18039704/…? 是的,我看到了那个帖子。我已经在互联网上搜索了几个小时,但不明白如何设置它。那篇文章是几年前的,对我一点帮助都没有。 github链接太复杂了,我无法理解。 我不知道 node.js。是否有一些Java代码可以类似地散列密码或其他东西?或者只是简化的 javascript...idk。 【参考方案1】:

尚未使用 Cloudant 对此进行测试,并且我尚未与密码学专家验证此方法的安全性(请这样做),但希望如此可能会为您指明正确的方向:

首先你需要生成一个salt和一个password_sha:

    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.util.Random;

    public class CouchPassword 

        public static void main(String[] args) throws NoSuchAlgorithmException 

            String password = "123456"; // your password        
            String salt = genSalt();
            password = password + salt;

            MessageDigest md = MessageDigest.getInstance("SHA1");
            md.update(password.getBytes());
            byte byteData[] = md.digest();

            System.out.println("Password SHA:   " + byteToHexString(byteData) );
            System.out.println("Generated Salt: " + salt);
        
        public static String genSalt() 
            Random ranGen = new SecureRandom();
            byte[] salt = new byte[16];
            ranGen.nextBytes(salt);
            return byteToHexString(salt);
        
        public static String byteToHexString(byte[] b)     
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < b.length; i++) 
             sb.append(Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1));
            
            return sb.toString();
        
    
    // There are libraries to help with generating SHAs and Hex Strings
    // but I have choosen not to use those here so the answer is more standalone.

将上面的密码字符串设置为需要的值,然后执行。例如

    Password SHA:   316ccb0df3c8bbd8f568347827803682d2c93849
    Generated Salt: bba45713ef54016c8ef4b56b6b147936

创建 _user 和 _security 文档(选项 1):

   // _user
    
           "_id"          : "org.couchdb.user:joe",
           "type"         : "user",
           "name"         : "joe",
           "roles"        : ["standarduser"],
           "password_sha" : "316ccb0df3c8bbd8f568347827803682d2c93849",
          "salt"         : "bba45713ef54016c8ef4b56b6b147936"
    

_users 文档中的角色映射到 _security 文档中定义的角色。

// _security

   "couchdb_auth_only": true,
   "members": 
     "names": [],
     "roles": ["standarduser"]
   ,
   "admins": 
 

来自CouchDB documentation

数据库成员 - 按数据库定义。他们可以从数据库中读取所有类型的文档,并且可以将文档写入(和编辑)到数据库中,但设计文档除外。

数据库管理员 - 按数据库定义。他们拥有成员拥有的所有特权以及以下特权:编写(和编辑)设计文档、添加/删除数据库管理员和成员、设置数据库修订限制 (/somedb/_revs_limit API) 并针对数据库执行临时视图 (/somedb/ _temp_view API)。他们不能创建数据库,也不能删除数据库。

在我的示例中,我的用户joe 被赋予了角色standarduser,该角色映射到数据库的数据库成员

创建 _user 和 _security 文档(选项 2):

请注意,我可以指定member.names,而不是使用roles

// _user document

  "_id"          : "org.couchdb.user:joe",
  "type"         : "user",
  "name"         : "joe",
  "password_sha" : "316ccb0df3c8bbd8f568347827803682d2c93849",
  "salt"         : "bba45713ef54016c8ef4b56b6b147936"


// _security document

  "couchdb_auth_only": true,
  "members": 
    "names": ["joe"],
    "roles": []
  ,
  "admins": 

警告

确保member.namesmember.roles 参数不为空,因为这将授予所有人读写权限:


  "couchdb_auth_only": true,
  "members": 
    "names": [],
    "roles": []
  ,
  "admins": 

没有成员,任何用户都可以编写常规文档(任何非设计文档)并从数据库中读取文档。

来源:http://wiki.apache.org/couchdb/Security_Features_Overview

【讨论】:

这是完美的。非常感谢!【参考方案2】:

Julie-- 在 Apache CouchDB 中,您当前必须使用验证功能来启用只读访问。 (没有“统包”用户角色可以满足我的需求。)

特别是,我发现这个帖子很有帮助:https://***.com/a/10713843/1459475

它链接到有关验证函数的官方 CouchDB 书籍部分:http://guide.couchdb.org/draft/validation.html 以及 JavaScript 示例和说明: https://github.com/iriscouch/manage_couchdb/blob/master/js/validate_doc_update.js https://github.com/iriscouch/manage_couchdb#an-easy-validation-function

在 Cloudant 中,使用 API 密钥进行只读访问稍微简单一些,但您仍然可以使用开箱即用的 CouchDB 实现只读访问。它并不像您预期​​的那样交钥匙。祝你好运!

【讨论】:

以上是关于通过 _users 数据库管理 Cloudant 访问的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的错误:尚未为上下文_加载模块名称“ @ cloudant / cloudant”。在javascript中使用require([])

couchdb/cloudant 更新处理程序未按预期工作

如何在 cloudant 结果 json 中限制 _rev_info

无法为 IBM Physio 应用程序填充 Cloudant 数据库

Cloudant 更改通知

无法在 Bluemix 上的 MobileFirst 容器上配置 Cloudant 数据代理