CouchDB 管理具有不同权限的数据库之间的同步

bhmjp9jg  于 2022-12-09  发布在  CouchDB
关注(0)|答案(1)|浏览(142)

我正在使用pouchdb和couchdb构建一个应用程序。结构是每个用户都有自己的数据库(我已经激活了每个用户选项)。
然后,为了简化,假设有一个数据库,该数据库聚集了所有用户的数据,即位置数据库。
此数据库与用户数据库同步。
对于每个用户数据库,用户都具有admin角色。
位置数据库具有管理员用户admin。常规用户不会作为管理员添加到此数据库。每个文档都具有userId属性。userdb和locationdb之间的同步将按userID筛选。
现在,当我以用户身份登录应用程序时,我有权限启动pouchdb上的localdb和couchdb上的userdb之间的同步。因为用户是userdb上的管理员。到目前为止一切顺利。

var remoteUser =
      new PouchDB(
        'https://domain:6984/' + 'userdb-' + hex,
        {
          auth: {
            username: 'user',
            password: 'password'
          }
        }
      )
    db.replicate.from(remoteUser).on('complete', function () {
      db.sync(remoteUser, { live: true, retry: true })
        .on('change', function (info) {
          dispatch('syncPrintQueue')
          console.log('sync remote user')
        }).on('pause', function () {
          console.log('user remote syncing done')
        })
    })

但是我想从应用程序同步userdblocationdb。作为用户,我不能这样做。所以我添加了auth作为管理员。现在我可以启动同步。

var remoteLocation =
          new PouchDB(
            'https://domain:6984/' + 'locationdb-' + locationHex,
            {
              auth: {
                username: 'admin',
                password: 'password'
              }
            }
          )

        remoteUser.replicate.from(remoteLocation).on('complete', function () {
          remoteUser.sync(remoteLocation, {
            live: true,
            retry: true
          })
            .on('change', function (info) {
              console.log('location remote syncing ')
            }).on('pause', function () {
              console.log('location remote syncing done')
            })
        })
        dispatch('syncCompany', remoteLocation)
      },

问题是现在我在当前会话中以admin身份登录。
我现在做的是在登录后将用户信息存储在localStorage上。我使用它来过滤或验证couch。而不是用户从检查当前会话返回。这将允许我正确地过滤服务器端。
将每个用户作为admin添加到通用数据库中是不可行的,所以我唯一的想法是将所有的同步和授权转移到一个中间件中,比如说Rails或Node。
couchdb中是否有解决方案来管理这种情况?

ecfsfe2w

ecfsfe2w1#

标准的持久性复制通常不能扩展到从(或向)多个数据库复制不频繁的更新。它已经得到了改进,支持使用调度程序在多个永久性复制之间循环,所以你可以看看它目前是否足够。
临时解决方案是spiegel project,它具有监听器进程,这些进程观察_global_changes提要并通过regex模式匹配数据库名称,以确定哪些源数据库已更改,需要由其更改或复制器进程之一重新检查。

相关问题