2012-04-22 24 views
11

Müşterimin bir koleksiyona erişmesini istemediğimi varsayalım, ancak istemcimin bu koleksiyondaki nesneler hakkında belirli sorular sormasını istiyorum. Bunu nasıl başarabilirim?Sunucudan değerler alma

Örnek olarak, bu reklam an giriş kullanıcı olup olmadığını bilmek istiyorum diyelim. Bir kullanıcı ilk giriş yaptığında Ben kaybolup Session ve çerez kullanıcının veritabanı kimliği. Şu anda, uygulama, bir kullanıcı elbette şimdi kundakçı açıp Session.set("user_id", "foo") demek ve şimdi oturum ediyorum çünkü çok güvensiz !Session.equals("user_id", null), eğer kaydedilir söylüyor.

İstemci erişimi olmasını istemiyoruz Bu noktada Kullanıcı koleksiyonuna. Bu koleksiyona erişimi olan tek istemci kodu, kendisini korumak için kendi kendini yürütme işlevine eklenmiştir (Meteor'da güvenliği yapmanın doğru yolu olup olmadığından emin değilim, bu yüzden bu satırlarda bir şeyler önermek için çekinmeyin. de). Bunun yerine, bazı sunucu tarafı kodlarını çağırmak ve oturumda ayarlanan kimliği iletmek ve geçerli bir kullanıcı olup olmadığını bana bildirmek istiyorum. İşte

kere ayarladıktan görmek istiyorum nasıl:

// client 
function logged_in() { 
    return SomeServerMethodThatValidatesUserId(Session.get("user_id")); 
} 

Meteor.methods

Meteor.call uyumsuz bir geri arama gerçekleştirir beri, tasarıyı uygun görünmemektedir. Pub/alt model biraz daha umut verici görünüyor, ancak belgelere göre nasıl çalıştığından emin değilim.

İstemcide bazı değerler ayarlamak için yayın işleyicisinden this.set numaralı telefonu aramamı öneririm, ancak bu değerlerin kullanılabilir olduğu yeri belirleyemiyorum. Ya da belki de pub/alt model bunun için doğru değildir ve eksik olduğum başka bir yol vardır. Herhangi bir tavsiye takdir edilir!

+1

Bu cevaba Meteor geliştiricilerinden biri tarafından bakın: http: // stackoverflow.com/questions/10115042/nasıl yapılır-client-side-mongodb-api/10116342 # 10116342 İstemcinin ve sunucunun isteğe bağlı mongo komutlarını yürütmesine izin veren varsayılan "eğitim çarkları" nı nasıl devre dışı bırakacağınızı gösterir. Daha sonra sadece Meteor.methods ve Meteor.publish aracılığıyla istemciye istediğiniz şeyi gösterebilirsiniz. Bu Meteor auth paketi bırakıldığında basitleştirilecektir. – rmarscher

cevap

6

İstemcinin, kimliği doğrulanana kadar veriye erişmesini kısıtlamaya çalıştığınız anlaşılıyor. Bunu yapmanın bir yolu:

İlk olarak, bir user_id argümanını alan sunucuda bir Meteor.publish işlevi yazın. İşleviniz ayrıcalıklı sunucu ortamında istediğiniz denetimi yapar ve sonuçta bir İmleç döndürür. Bir basit örnek olacaktır: istemci üzerinde Sonra

// define collection on both client and server 
Users = new Meteor.Collection('users'); 

// server-side publish 
Meteor.publish('my-user', function (user_id) { 
    if (someServerMethodThatValidatesUserId(user_id)) 
    // publish a single user object to the client 
    return Users.find({_id: user_id}); 
}); 

, sen elinde bir user_id yaptırdıktan sonra my-user setine abone: Artık

// client-side 
Meteor.subscribe('my-user', Session.get('user_id')); 

, üzerinde kullanıcılar bir belgeyi gerekecek İstemci someServerMethodThatValidatesUserId sunucuda çalışan ve someServerMethodThatValidatesUserId tarafından belirlendiğinde ve yalnızca user_id geçerliyse. Bir Mongo sorgusuna güvenmek yerine, istemciye gönderilen belirli belgeleri el ile yönetmek istiyorsanız,

(this.set, yayınlama işlevinizin içinde kullanılabilir. Fakat bunun gibi bir şey düşünmüyorum burada.)

+1

Bu, tüm Kullanıcılarım koleksiyonuma erişmek isteyen müşteri kodumun diğer bölümleriyle bir çakışma yaratacak gibi görünüyor değil mi? – Samo

+0

bu kötü değil, kullanıcı 'user_id' oturum değerini değiştirmeye karar verse bile sunucu yine de doğrulayacaktır. – Adgezaza