arangodb验证_users密码

时间:2016-05-19 13:13:52

标签: python arangodb

如何验证给定密码是否与arangoDB中集合_users的密码匹配?

我知道可以用Foxx app和arangosh完成,但我没有使用它们,因为我在python中使用自己的API。因此,我不知道如何访问密码并检查是否与给定密码匹配而不使用Foxx或arangosh。

2 个答案:

答案 0 :(得分:2)

您不应该依赖系统_users集合来获取自己的用户逻辑。该集合严格用于ArangoDB自己的用户对象,而不是用于应用程序级用户管理。

如果您确实想要使用ArangoDB自己的用户管理,那么在禁用身份验证时公开它的最佳方法是使用ArangoDB中的org/arangodb/users模块(例如使用Foxx)。该模块提供了一个isValid方法,该方法获取用户名和密码,并返回一个布尔值,指示组合是否有效:

var users = require('org/arangodb/users');
controller.post('/checkpw', function (req, res) {
  var credentials = req.params('credentials');
  res.json({
    valid: users.isValid(
      credentials.username,
      credentials.password
    )
  });
})
.bodyParam('credentials', joi.object({
  username: joi.string().required(),
  password: joi.string().required()
}).required());

用户HTTP API目前不公开此方法,因此这是唯一的方法,而不依赖于极不稳定的实现细节(_users集合的格式在整个2.x和收集可能在将来再次改变。)

编辑:当提供有效的用户名和密码时,ArangoDB 3.0可能会添加一个API路由,该路由返回一个令牌(而不是使用会话对象混乱数据库)。这应该可以更容易地与内置用户管理集成,但警告仍然相同:ArangoDB用户主要用于API级别授权,而不是用于应用程序逻辑。

答案 1 :(得分:1)

最简单的方法是简单地尝试一个平面的http请求,并检查其结果。最简单的电话是_api/version;我们在数据库前添加前缀,以确定是否允许用户访问特定数据库。对于此示例,我们使用_system;您需要将其替换为要测试身份验证的数据库。

curl --dump - http://Joe:passvoid@localhost:8529/_db/_system/_api/version
GET /_db/_system/_api/version HTTP/1.1
Authorization: Basic Sm9lOnBhc3N2b2lk
User-Agent: curl/7.38.0
Host: localhost:8529
Accept: */*


HTTP/1.1 200 OK
Server: ArangoDB
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
Content-Length: 37

{"server":"arango","version":"2.8.8"}

curl --dump - http://Joe:WRONGpassvoid@localhost:8529/_db/_system/_api/version 
GET /_db/_system/_api/version HTTP/1.1
Authorization: Basic Sm9lOldST05HcGFzc3ZvaWQ=
User-Agent: curl/7.38.0
Host: localhost:8529
Accept: */*

HTTP/1.1 401 Unauthorized
Server: ArangoDB
Content-Type: text/plain; charset=utf-8
Www-Authenticate: basic realm="arangodb/_system"
Connection: Keep-Alive
Content-Length: 0

因此,您需要检查HTTP状态代码:200 - >成功; 401 - >失败。有关特定于python的http处理的详细信息,请参阅howto create authentication headers with python