2011-01-19 15 views

cevap

22

Evet, CouchDB yetkisiz okumaları önleyebilir. Ne yazık ki, biraz daha basittir.

Bir gizli açık artırma uygulaması düşünün. 20 dolar teklif edersiniz ve 10 dolar teklif ederim; her bir teklif bir kanepe belgesinde. Kanepe, kendi teklif belgelerini okumamıza izin verir, ancak başkaları yoktur. Ancak,, ortalamayı gösteren bir harita azaltma görünümü var. Görünümü yüklüyorum ve ortalamanın 15 ABD doları olduğunu görüyorum. Bu nedenle, teklifinizin 20 TL olduğunu ve güvenlik politikasını ihlal ettiğimi söylüyorum. Görünüm çıkışı, bir belgenin bazı bilgilerinden veya bir kısmından sızabilir. Belge düzeyinde güvenliği sağlamak mümkün değildir. Bu yüzden okuma erişimi veritabanı düzeyinde.

Biliyorum, bu berbat. Ama bu tek doğru, ölçeklenebilir cevaptır.

Bu, Couch felsefesinin, kullanıcı başına bir (veya daha fazla!) Çok sayıda — veritabanı oluşturması nedenidir. Bir veritabanına okuma izni, _security nesnesinin readers değerinde ayarlanır. (O da DB yazabilirsiniz kim belirttiği için CouchDB bagaja, alan readers was renamed to members unutmayın.)

tekniği şu şekilde çalışır:

  1. her kullanıcı için bir veritabanı oluşturun. Kullanıcının okuyabileceği tüm belgeleri tutacaktır. Kullanıcıyı (veya kullanıcının rolünü) _security nesnesine ekleyin.
  2. Ana veritabanında, okuma ilkesini uygulayan bir filtre işlevi oluşturun. (Kod validate_doc_update ile paylaşılabilir.)
  3. Ana veritabanından kullanıcının veritabanına ?filter=my_filter_function ile çoğaltın.
  4. Kullanıcının veritabanını yüklemesine (veya çoğaltmasını) izin ver.

Elbette, bu kullanıcıların doğrudan Couch'a eriştiği, saf bir Couch uygulaması içindir. Orta katmanınız varsa (MVC denetleyicisi veya yalnızca bir ters HTTP proxy'si), o zaman kullanıcı ile kanepe arasında buradaki ilkeyi uygulayabilirsiniz. Ancak dikkatli olun. Örneğin, _show işlevi veya _rewrite kuralı, bir kullanıcının politikanıza rağmen bir görünüm veya belge yüklemesine izin verebilir.

İyi şanslar!

+0

Teşekkürler! _Show ve _rewrite'in beni nasıl ısırdığını anlatabilir misin? Ayrıca, "biriyle arkadaş olma -> fotoğraf yükle" gibi yarış koşullarından nasıl kaçınacağım ve arkadaşının o fotoğrafı hiç göremediğinden% 100 emin olabilir miyim? – nornagon

+0

Eh, URL'ye göre kullanıcı başına belge başına erişim izni veren/reddeden bir ters proxy uygulamanız olduğunu varsayalım. Daha sonra, bir _list işlevini kullanarak yeni bir özellik eklersiniz ve tüm _list sorgularına proxy tarafından izin verilir. Bir kullanıcı, yapmaması gereken belgeleri görmek için _list'in nasıl kullanılacağını anlayabilir. Benzer şekilde, bir _rewrite kuralı normal '/ db/doc_id' yolu olmayan belgeleri görmenin bir yolunu sağlayabilir. Öyleyse, vekilinizin deliksiz olduğundan emin olmalısınız. – JasonSmith

+2

İkinci soru, ** okuma ** okuma ** erişim ** okuma ** hakkında daha fazla bilgi. Yeni bir soru sormanızı öneriyorum ("CouchDB güvenlik modelinde okuma erişimini iptal etme"). Yapabilirsem cevap vereceğim! Her kullanıcı için bir veritabanı oluşturma – JasonSmith