【问题标题】:Most efficient way to determine CouchDB access permission确定 CouchDB 访问权限的最有效方法
【发布时间】:2014-05-20 21:01:03
【问题描述】:

我正在使用具有每个数据库和用户访问权限的 CouchDB 权限系统。每个 DB 代表一个应用程序,这些应用程序显示在类似主屏幕的概览中和其他位置。我需要一种有效的方法让 CouchDB 告诉我用户是否有权访问数据库 - 例如 GET /_all_dbs 仅返回当前用户有权访问的数据库。一旦有十几个左右的应用程序显示在一个页面上,轮询视图或文档就会变得太慢,尽管我仍然可以使用 limit=1 调整视图轮询。难道没有更好的办法吗?

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    查询数据库的_security文档。

    curl http://localhost:5984/db_name/_security

    {"admins":{"names":["dbadmin"],"roles":["reader"]},"members":{"names":[],"roles":[]}}

    对于每个具有管理员/用户的数据库,couchdb 都会创建一个名为 _security 的特殊文档,其中包含该数据库所有用户的列表。您可以向该文档发出 curl 请求并获取一个数组,该数组将为您提供该数据库的所有 adminsmembers

    编辑

    您最了解您的应用程序,但我认为这里有一个策略可能会有所帮助?每个 couchdb 用户都存储在 _users 数据库中。它就像任何其他数据库一样。您可以在其上创建一个视图,然后对其进行查询。您甚至可以在文档中添加其他字段以帮助查询。当您在数据库上创建用户时,您如何更新_users 数据库中的相应文档。

    现在,如果您致电_users/_all_docs?include_docs=true,您将获得一份用户列表以及他们有权访问的数据库。一个请求,您就拥有了所需的一切。

    【讨论】:

    • 谢谢。它仍然不是一个理想的解决方案,因为 1) 它可能不会比轮询视图更快,因为它仍然是每个 DB 的一个请求,并且 2) 基本上必须重新实现 CouchDB 用来检查用户是否具有访问权限的代码- 幸运的是,这并不多,因为 couchdb 没有复杂的读取访问权限。
    • 我不确定在这种情况下什么是最好的方法。我想补充的一件事是,如果您创建了一个视图,那么您可以一次使用多个键查询它。你能分享一下你目前用来查询的视图吗?
    • 查询多个键无济于事-据我所知,一个视图查询只能转到一个数据库-如果您需要检查 20 个数据库的访问权限,则必须执行 20 个请求.以下是我要做的: 1) 在用户会话中缓存可访问的应用程序。 2)在登录时擦除这个会话状态,这样我就不需要实现太复杂的缓存更新机制了。
    • 好的。你知道它是否听起来不太复杂,我还有另一个建议。评论太大了,所以我将在答案中添加它。如果有帮助,请告诉我。
    • 感谢您的建议。这是一个有趣的想法。我会说这样做是有意义的,如果你 a) 不使用角色来授予用户数据库访问权限,并且 b) 永远不要将成员字段留空,这样访问权限总是受到限制,即,如果你总是将所有用户分配给你想要直接访问成员和管理字段。但是,在使用角色和/或可以对所有用户开放访问的一般情况下,您的建议将是一个相当复杂的更新代码 - 因此我不会在我的情况下使用它。
    猜你喜欢
    • 2012-05-29
    • 2020-07-18
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多