gpt4 book ai didi

couchdb - 通过 _users 数据库管理 Cloudant 访问

转载 作者:行者123 更新时间:2023-12-02 16:54:27 25 4
gpt4 key购买 nike

我已经创建了 _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" ] } }

有什么建议吗?

谢谢!

最佳答案

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

首先您需要生成盐和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) 以及针对数据库执行临时 View (/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": {}
}

Having no members, any user can write regular documents (any non-design document) and read documents from the database.

Source: http://wiki.apache.org/couchdb/Security_Features_Overview

关于couchdb - 通过 _users 数据库管理 Cloudant 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33152085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com