【问题标题】:arangodb verify _users passwordarangodb 验证 _users 密码
【发布时间】:2016-05-19 13:13:52
【问题描述】:

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

我知道这可以通过 Foxx 应用程序和 arangosh 完成,但我没有使用它们,因为我在 python 中使用我自己的 API。所以我不知道如何在不使用 Foxx 或 arangosh 的情况下访问密码并检查是否与给定密码匹配。

【问题讨论】:

    标签: python arangodb


    【解决方案1】:

    您不应该依赖系统 _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 级授权,而不是应用程序逻辑。

    【讨论】:

    • 谢谢。那么我想最好的选择是创建我自己的用户集合
    【解决方案2】:

    最简单的方法是简单地尝试一个简单的 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

    【讨论】:

    • 问题是我没有激活 arangodb 身份验证,所以我可以使用错误或正确的密码You are about to log in to the site "localhost" with the username "Joe", but the website does not require authentication [...] 访问。我不想激活身份验证,因为用户不直接访问数据库,而是通过应用程序,所以我只想利用 arangodb 附带 _users 集合并使用它。如果无法从_users 获取密码,也许我应该创建自己的用户集合? (但这是我试图避免的)
    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2014-10-18
    相关资源
    最近更新 更多