CouchDB сцэнар базы дадзеных для кожнага карыстальніка з прыватнай сістэмай абмену паведамленнямі

Мне было цікава, як пабудаваць сістэму, у якой карыстальнікі могуць адпраўляць паведамленні іншым карыстальнікам. Вядома, кожны павінен мець магчымасць атрымаць доступ толькі яго паштовай скрыні, так што нам патрэбна інфраструктура базы дадзеных для кожнага карыстальніка для гэтага. Прытрымліваючыся прыкладу з http://guide.couchdb.org/draft/notifications.html , мы бачым, што карыстальнікі можна проста змясціць паведамленні ў базу дадзеных атрымальніка. Просты і эфектыўны.

Але што, калі мы не хочам, каб дазволіць карыстальнікам даведацца імя базы дадзеных атрымальнікаў? Што рабіць, калі мы хочам, каб сістэма, якая будзе вырашыць «базу дадзеных атрымальнікаў, гледзячы на ​​ у поле дакумента паведамленні (які можа быць імя карыстальніка, зусім не звязаны з яго імем базы дадзеных):

{
    "to": "john.kowalski",
    "from": "jake.podolski",
    "subject": "hi",
    "message": "..."
}

Падобна на тое, што ідэальная задача для дадатковага ўзроўню, але тады гэта не было б ніякага задавальнення і не варта пытання, таму мы будзем спрабаваць вырашыць гэтую праблему з дапамогай рэплікацыі:

  1. Карыстальнік змяшчае паведамленне дакумент у асноўнай базе дадзеных
  2. задача рэплікацыі (мы б задача для кожнага карыстальніка) выбірае, што дакумент з дапамогай фільтра, які фільтруе _changes сілкуецца ад у полі. Назва «john.kowalski» будзе перададзена ў якасці параметру для функцыі фільтра.
  3. Дакумент заканчваецца ў базе дадзеных атрымальніка.

However, this creates a problem, because main database would have to be visible to all users! So...what if we would be able to add user->main replication task as well, so that the messages would be picked up from user database transferred to main database and then placed in recipients database (oh lord, it's getting complicated, we may already waste our time by trying to solve it this way, but let's try).

  1. Карыстальнік змяшчае паведамленне дакумент у яго базе дадзеных
  2. задача рэплікацыі здабывае гэты дакумент, але не можа выкарыстоўваць функцыю фільтра любога роду, так як фільтр у гэтым выпадку належыць карыстальніку, і таму нельга давяраць.
  3. Асноўная база дадзеных правярае дакумент - ён правярае, ці з'яўляецца <ЕМ> ад поле з'яўляецца той, які звязаны з зыходнай базай дадзеных
  4. .
  5. Задача рэплікацыі выкарыстоўваецца ў папярэднім падыходзе перадае дакумент атрымальніку.

Існуе праблема ў трэцім кроку тут (без гэтага кроку, карыстальнікі змогуць адпраўляць паведамленні выдаюць сябе якія-небудзь іншыя карыстальнік, запоўніўшы фіктыўныя дадзеныя ў ад поля) - як мы ў стане перадаць дадатковыя дадзеныя функцыі праверкі , адзіныя параметры там, наколькі я ведаю, з'яўляюцца:

  • стары дакумент
  • новы дакумент
  • кантэкст карыстальніка (аўтарызаваныя імя карыстальніка, ролі, дб, да якіх дакумент запісваецца)
  • Аб'ект бяспекі?

Па loooking па функцыянальнасці базы дадзеных рэплікатары, уведзенай у 1.1.0, мы маглі б прайсці user_ctx кантэкст задачы рэплікацыі. Ці можна для гэтага аб'екта змяшчае карыстацкія дадзеныя, у адрозненне ад рэальнай інфармацыі пра карыстальніка? Як гэта паўплывае на стандартны спосаб CouchDB апрацоўвае доступ да базы дадзеных?

Калі гэта будзе магчыма, задача рэплікацыі будзе проста імя атрымальніка, запоўненае ў якасці параметру пры user_ctx, то функцыя праверкі будзе выкарыстоўваць гэта значэнне для параўнання з ад поля. Там не было б ніякага спосабу для карыстальніка на паведамленне «адправіць», як нехта іншы, чым ён.

5
Для запісу, я даволі дасведчаны аб тым, я мог бы проста злоўжываю рэплікацыю тут, і некаторыя работнік задача працуе як адміністратар (так, што ён можа чытаць ўсе базы дадзеных) можа перамяшчаць дакументы вакол у больш надзейным і просты спосаб.
дададзена аўтар Bartosz, крыніца

3 адказы

Вы зрабілі вялікую здагадка тут:

<Р> Тым не менш, гэта стварае праблему, таму што база дадзеных будзе мець у   бачны ўсім карыстальнікам!

Існуе альтэрнатыўнае рашэнне, якое дазваляе пазбегнуць асноўныя базавыя дадзеных бачных для ўсіх карыстальнікаў. Замест таго, каб кожны карыстальнік паклаў паведамленне дакументы непасрэдна ў асноўную базу дадзеных, вы маглі б карыстальнікі захаваць паведамленне дакументы ў сваю ўласную базу дадзеных і наладзіць фільтраваныя рэплікацыю для перадачы паведамленняў у асноўную базу дадзеных. Асноўная база дадзеных можа быць абмежавана, так што звычайныя карыстальнікі прыкладання не могуць атрымаць доступ да яго. Рэплікацыя паміж базамі дадзеных карыстальнікаў і асноўнай базы дадзеных неабходна будзе ініцыяваная адміністратарам, але гэта трэба толькі зрабіць адзін раз для кожнага карыстальніка, паколькі задачы рэплікацыі з'яўляюцца сталымі ў бягучых версіях CouchDB.

2
дададзена

Гэтае пытанне падобны на гэтае пытанне аб базы дадзеных паштовай скрыні патч зробіць гэта усё значна лепш.

1
дададзена
Так, вялікі патч сапраўды!
дададзена аўтар Bartosz, крыніца

Вы можаце наладзіць канапу так, што карыстальнік мае права на чытанне і запіс рэгулярных дакументаў у базе дадзеных, але не можа змяніць _design дакументаў. Такім чынам, вы можаце давяраць праверку ў базе дадзеных карыстача, калі гэта не разгорнута на сайце карыстальнікаў, але тады вам трэба будзе капіяваць дадзеныя ў базу дадзеных у любым выпадку. Я думаю, я магу толькі пагадзіцца з вашым сцвярджэннем, што гэта можа быць зроблена з задачай рабочай :). У матэр самай справе я лічу, што гэта будзе «Couch Way», улічваючы, што сегментаванне/кластарызацыю таксама выконваюцца з вонкавымі скрыптамі Python.

1
дададзена
будзе працаваць, але я хачу, каб дазволіць карыстальнікам змяняць свае праектныя дакументы (налады праз couchapps), такім чынам, яны павінны быць адмінамі сваіх баз дадзеных.
дададзена аўтар Bartosz, крыніца