2013-09-22 2 views
5

좋아요, 그래서 저는 약간 Meteor.js와 약간 혼돈 스럽습니다. 다양한 컨셉을 테스트 할 사이트를 만들었고 정상적으로 작동했습니다. "안전하지 않음"과 "자동 게시 취소"를 제거한 후에는 서버를 검색하여 서버에 푸시하려고 할 때 여러 번의 "액세스 거부"오류가 발생합니다. 나는 다음 코드와 함께 할 수있는 뭔가가 보라 :Meteor.js 게시 및 구독?

Template.posts.posts = function() { 
    return Posts.find({}, {sort: {time: -1}}); 
} 

내가 그것이 "불안"과 "autopublish"활성화 된하지만 한 번 할 수 한, 직접 컬렉션에 액세스를 시도하고 있다고 생각 그것은 접근이 거부되었다는 것을 불가능하게했다. 내가 생각하는 또 다른 부분은 문제가있다 :에게 허용되지 않는, 직접 컬렉션에 액세스하려고 :

else { 
    Posts.insert({ 
    user: Meteor.user().profile.name, 
    post: post.value, 
    time: Date.now(), 
}); 

가 나는 것은 같은 종류의 일이 일어나고 있다고 생각합니다.

제 질문은 어떻게 다시 보안을 적용하여 "안전하지 않은"및 "자동 게시"가 필요하지 않도록 할 수 있습니까?

감사합니다.

최종 편집 :

/** 
* Models 
*/ 
Posts = new Meteor.Collection('posts'); 

posts = Posts 

if (Meteor.isClient) { 

    Meteor.subscribe('posts'); 


} 

if (Meteor.isServer) { 

    Meteor.publish('posts', function() { 
     return posts.find({}, {time:-1, limit: 100}); 
    }); 


    posts.allow({ 

     insert: function (document) { 
      return true; 
     }, 
     update: function() { 
      return false; 
     }, 
     remove: function() { 
      return false; 
     } 

    }); 

} 
+0

이 그래, 당신이 선언의 모든 질문에 대한 답변 "이 작업은 허용하지 않습니다" 변수 'Posts'는 서버에있는 'posts'로 액세스하려고 시도합니다. 실행되지 않는 코드를 보여주는 질문과 대답이있는 것처럼 오타를 수정해야합니다. – user728291

답변

7

좋아, 그래서 두 부분은이 질문이 있습니다 :

Autopublish

유성에, 당신이 필요를 데이터베이스를 게시하려면 프로젝트의 서버 측과 클라이언트 측 모두에 코드가 있어야합니다. 당신이 컬렉션 (Posts = new Meteor.Collection('posts')를) 인스턴스화 한 가정에, 당신은

if (Meteor.isClient) { 
    Meteor.subscribe('posts', subsargs) //here is where you can pass arguments 
} 

안전하지 않은 클라이언트에 대한

if (Meteor.isServer) { 
    Meteor.publish('posts', function(subsargs) { 
     //subsargs are args passed in the next section 
     return posts.find() 
     //or 
     return posts.find({}, {time:-1, limit: 5}) //etc 
    }) 
} 

그런 다음 필요 불안의 목적은 클라이언트가 무차별 적으로 추가 할 수 있도록하는 것입니다

수정하고 원하는 모든 데이터베이스 항목을 제거하십시오. 그러나 대부분의 경우 당신은 그것을 원치 않습니다. 안전하지 않은 것을 제거한 후에는 누가 무엇을 할 수 있는지를 설명하는 서버에 규칙을 설정해야합니다. 이 두 함수는 db.allow와 db.deny입니다. 예 : 마찬가지로

if (Meteor.isServer) { 
    posts.allow({ 
     insert:function(userId, document) { 
      if (userId === "ABCDEFGHIJKLMNOP") { //e.g check if admin 
       return true; 
      } 
      return false; 
     }, 
     update: function(userId,doc,fieldNames,modifier) { 
      if (fieldNames.length === 1 && fieldNames[0] === "post") { //they are only updating the post 
       return true; 
      } 
      return false; 
     }, 
     remove: function(userId, doc) { 
      if (doc.user === userId) { //if the creator is trying to remove it 
       return true; 
      } 
      return false; 
     } 
    }); 
} 

true의 응답을 제외하고는 동일한 방식으로 작동합니다 db.deny을 의미합니다

희망이

+0

'insert : function (userId, document)'또는'update : function (userId, doc, fieldNames, modifier)'라고 말하면 어떻게 그 인수를 전달합니까? 그리고 클라이언트 또는 서버에서 그렇게합니까? –

+1

당신은 그 기능들을 본질적으로 호출하지 않습니다. 그들은 특정 이벤트에 유성에 의해 호출되며, 호출자에 의해 인수를 통과 시켰습니다. 이게 말이 돼? – Zwade

+0

Mmkay, 그래서 그들은 특정 이벤트에 의해 호출 ...하지만 인수가 전달되는 방법을 잘 모르겠습니다.클라이언트 코드가 insert/update/remove 함수를 트리거하고 인수가 전달되는 예제를 제공 (또는 링크) 할 수 있습니까? –