Soru Veritabanı Başına Temelli CouchDB Yetkilendirmesi


CouchDB tarafından desteklenen bir uygulama üzerinde çalışıyorum. Esasen, uygulamamın her bir kullanıcısı için bir veritabanı oluşturmak istiyorum. Bunu başarmak için, yönetici kullanıcı veritabanını oluşturacaktır, ancak ileride, kullanıcının kendi veritabanına (SSL üzerinden HTTP Auth kullanarak) erişmesi gerekecektir. Bunu anlatan bir zaman geçirdim.

Bulduğum en iyi kaynak, bu bağlantıda CouchDB wiki'sinde:

http://wiki.apache.org/couchdb/Security_Features_Overview#Authorization

Yönetici başına bir karma eklediğiniz "_security" adlı bir belge oluşturarak veritabanı başına yetkilendirmeyi ayarlayabileceğinizi gösterir. Bu belgeyi oluşturmaya çalıştığımda geri döndüğüm mesaj "Kötü özel belge üyesi: _security".

$ curl -X GET http://localhost:5984
{"couchdb":"Welcome","version":"1.0.1"}

Herhangi bir yardım takdir edilecektir!

Alkış,

Aaron.


25
2017-10-29 19:59


Menşei


Hey Aaron, bir kullanıcı her kaydolduğunda yeni bir veritabanı oluşturmayı nasıl başardınız? Php, node, ruby ​​gibi başka bir katman kullandın mı? Ya da saf bir couchapp yolu anladın mı? - Costa


Cevaplar:


Bu yaklaşımla ilgili bir problem olmamalı.

Diyelim ki bir "test" veritabanı var ve bir yönetici hesabınız var:

curl -X PUT http://localhost:5984/test -u "admin:123"

Artık bunun için bir güvenlik belgesi oluşturabilirsiniz:

curl -X PUT http://localhost:5984/test/_security -u "admin:123" -d '{"admins":{"names":[], "roles":[]}, "readers":{"names":["joe"],"roles":[]}}'

Sadece "joe" kullanıcısı veritabanını okuyabilecektir. Kullanıcıyı oluşturmak için zaten sha1 hashed şifreniz olmalı:

curl -X POST http://localhost:5984/_users -d '{"_id":"org.couchdb.user:joe","type":"user","name":"joe","roles":[],"password_sha":"c348c1794df04a0473a11234389e74a236833822", "salt":"1"}' -H "Content-Type: application/json"

Bu kullanıcı "123" şifresini sha1 ile "1" (sha1 ("123" + "1")) ile şifrelemekte, böylece veritabanını okuyabilmektedir:

curl -X GET http://localhost:5984/test -u "joe:123"

O veritabanında şu anda herhangi bir belge okuyabilir ve başka hiçbir kullanıcı (ancak onun ve yönetici) yapamaz.

GÜNCELLEME: Yazar güvenliği

Yukarıdaki yöntem okuyucu sorununu çözmektedir, ancak okuyucu izni burada aslında "ortak dokümanlar okuma / yazma" anlamına gelmektedir, bu nedenle tasarım dokümanları haricinde doküman yazılmasına izin vermektedir. _Security belgesindeki "admin" ler, bu veritabanında tasarım dokümanları yazabilir.

Diğer bir yaklaşım, kendi cevabınızdan alındığı gibi, "validate_doc_update" dir, bir dosyada aşağıdaki gibi bir validate_doc_update olabilir:

function(new_doc, old_doc, userCtx) {
  if(!userCtx || userCtx.name != "joe") {
      throw({forbidden: "Bad user"});
  }
}

Ve bir couchdb tasarımına itin:

curl -X PUT http://localhost:5984/test/_design/security -d "{ \"validate_doc_update\": \"function(new_doc,doc,userCtx) { if(userCtx || userCtx.name != 'joe') {throw({forbidden: 'Bad user'})}}\"}" --user 'admin:123'

"Joe", Temel Kimlik Doğrulamayı kullanarak veritabanına yazabilirler:

curl -X PUT http://localhost:5984/test/foobar -d '{"foo":"bar"}' -u 'joe:123'

Ayrıca ele aldığınız gibi, kimlik doğrulama için bir çerez almak için _session api'yi kullanabilirsiniz:

curl http://localhost:5984/_session -v -X POST -d 'name=joe&password=123' -H "Content-Type: application/x-www-form-urlencodeddata"

Bu, aşağıdaki gibi bir başlık döndürür:

Set-Cookie: AuthSession=am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz; Version=1; Path=/; HttpOnly

Böylece bir sonraki isteğinize "AuthSession = am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz" çerezini ekleyebilir ve bunlar doğrulanacaktır.


47
2017-10-30 03:26



Daha spesifik olmalıydım. Kullanıcılara yazmak veritabanına, okunmaz. Ama bunun için bazı cevaplar buldum, bu yüzden cevabımı şimdi güncelliyorum ... - Aaron Vegh
Aaron, ilerlemeni görmek güzel. _Security belgesindeki okuyucunun tasarım dökümanları haricinde de yazmasına izin verilmiş (bunun çok özledim bir isim olduğunu görüyorum). Cevabımı validade_doc_update ve session api dahil olmak üzere yazma izinleri hakkında daha fazla bilgi için güncelledim. - diogok
Bazı okuyucu kullanıcıları kurdum. Kimlik doğrulaması yapmak için nasıl çalışacağım. Temel kimlik doğrulaması curl ile çalışır. Kimlik doğrulamaya (herkesin okuyabileceği) başka bir db mi kurdum? Sonra yönlendirme, diğerinin _rewrite işaret eden bir db _rewrite? - ctrl-alt-delor


Daha fazla araştırma ve test yapıyorum ve nereye gittiğimi ve neyin hala işe yaramadığını özetlemek istiyorum.

Öncelikle, bu soruyu okuyanlar için özür dilerim: İnsanların yazması, veritabanını okumaları için izinler belirlemenin yollarını aradım. Büyük bir fark ortaya çıkıyor: Bir "okuyucu" yaratma teknikleri tamamen bir "yazar" yaratmaktan tamamen farklıdır (bu terim aslında var olmasa da, nedenini merak etsem de).

Kısaca: CouchDB örneğinizdeki herhangi bir veritabanına erişimi olan kullanıcıların listesi olan _users veritabanına bir kullanıcı eklemeniz gerekir. Bunu benzer bir komut vererek yapabilirdim:

curl -X PUT http://admin:password@localhost:5984/_users/org.couchdb.user:username -d '{"type":"user", "hashed_password":"2bf184a2d152aad139dc4facd7710ee848c2af27", "name":"username", "roles":[]}'

Görünüşe göre kullanıcı adını "org.couchdb.user" öneki ile adlandırmanız gerekir. Hashed_password değerini almak için Ruby hashing yöntemini kullandım:

require 'digest/sha1'
pass_hash = Digest::SHA1.hexdigest(password)

Bu, veritabanına görünüşte geçerli bir kullanıcı alır. Bir sonraki adım, yarattığım yeni veritabanı için bu kullanıcıyı bir "yazar" (ha, yine var!) Olarak atamaktır. Yani şöyle bir şey yapabilirim:

curl -X PUT http://admin:password@localhost:5984/newdatabase

ve sonra

curl -X PUT http://admin:password@localhost:5984/newdatabase/_design/security -d @security.json

Bu .json dosyası, "validate_doc_update" anahtarı için bir Javascript işlevi içerir ve bu işlev şöyle görünür:

function(new_doc, old_doc, userCtx) {
     if(userCtx.name != username) {
         throw({forbidden: "Please log in first."});
     }
   }

Döner kavşak, ama mantıklı. Ancak, şimdi bir sorunla karşılaşıyorum: görünüşe göre userCtx değişkeni kullanıcı doğrulanana kadar doldurulmuyor. Bu makale Yapmanız gereken tek şey, kimlik bilgilerini bir HTTP isteği aracılığıyla özel bir _session veritabanına iletmektir:

curl -X POST http://username:password@localhost:5984/_session

Bunu yönetici kullanıcım için yapabilirim ve userCtx var. Ancak yeni oluşturduğum kullanıcı için başarısız oluyor:

$ curl http://org.couchdb.user:username:password@localhost:5984/_session
{"ok":true,"userCtx":{"name":null,"roles":[]},"info":{"authentication_db":"_users","authentication_handlers":["cookie","oauth","default"]}}

UserCtx hash değerinin boş olduğunu unutmayın. Bu isim uzayında sorunun neden olup olmadığını merak ediyorum. İçinde korkunç bir kolon var, bu yüzden şifre ile ilgili bazı karışıklıklar var mı? Ad alanı olmadan bunu yapmaya çalıştım ve hiç işe yaramıyor; En azından burada isteğim veritabanına isabet ediyor ve yanıt alıyor gibi görünüyor.

Bu noktada sıkıştım. Şimdiye kadar benim varsayımlarımı ve ilerleyişimi kontrol edebilecek biri varsa, umarım hepimiz bu işi nasıl yapacağımızı anlayabiliriz.

Teşekkürler!

Aaron.


5
2017-11-01 13:32



Futon giriş ve çıkış kontrolünün ne yaptığını incelerseniz, kullanıcılarınızın uygulamanıza giriş yapabilecekleri genel bir yol göreceksiniz. Curl ile erişiyorsanız, Futon'da üye olarak üye oluşturabilirsin. - J Chris A
Kimlik doğrulaması yapılırken "org.couchdb.user" önekine ihtiyacınız yoktur, bu _users db dosyasında saklamak için _id dosyasına eklenmiştir. basitçe curl http://username:password@localhost:5984/_session ve bir userCtx nesnesi almalısınız. - natevw


Matt Woodward'ın - CouchDB Kimlik Doğrulama ve Güvenlik için Kesin Rehber'e göz atmak isteyebilirsiniz. http://blog.mattwoodward.com/2012/03/definitive-guide-to-couchdb.html


0
2018-06-05 11:54