2012-04-22 47 views
11

Giả sử tôi không muốn khách hàng của tôi có quyền truy cập vào bộ sưu tập, nhưng tôi muốn khách hàng của tôi có thể hỏi một số câu hỏi về các đối tượng trong bộ sưu tập đó. Làm thế nào tôi sẽ đạt được điều này? Ví dụ, giả sử tôi muốn biết nếu hiện tại người dùng đã đăng nhập. Khi người dùng đăng nhập lần đầu, tôi đặt id cơ sở dữ liệu của người dùng đó trong Session và trong cookie. Hiện tại, ứng dụng cho biết người dùng đã đăng nhập nếu !Session.equals("user_id", null), điều này tất nhiên là rất không an toàn vì bây giờ tôi có thể mở firebug và nói Session.set("user_id", "foo") và giờ tôi đã đăng nhập.Lấy các giá trị từ máy chủ

Tôi không muốn khách hàng có quyền truy cập vào bộ sưu tập Người dùng tại thời điểm này. Mã máy khách duy nhất có quyền truy cập vào bộ sưu tập này được đính kèm trong một chức năng tự thực thi nhằm bảo vệ nó (tôi không chắc đó có phải là cách đúng đắn để thực hiện bảo mật trong Meteor hay không). cũng). Vì vậy, thay vào đó tôi muốn gọi một số mã phía máy chủ và vượt qua nó id được thiết lập trong phiên và có nó cho tôi biết nếu đó là một người dùng hợp lệ hay không.

Đây là cách tôi muốn nhìn thấy nó thiết lập:

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

Meteor.methods dường như không phù hợp với những hóa đơn, vì Meteor.call thực hiện một cuộc gọi lại không đồng bộ. Mô hình pub/sub trông có vẻ hứa hẹn hơn một chút, nhưng từ tài liệu, tôi không hoàn toàn chắc chắn về cách nó hoạt động.

Dường như đề nghị tôi nên gọi this.set từ bên trong trình xử lý xuất bản để đặt một số giá trị trên máy khách, nhưng tôi không thể tìm ra nơi các giá trị đó có sẵn.

Hoặc có thể mô hình pub/sub không phù hợp với điều này và có một cách khác mà tôi bị thiếu. Lời khuyên nào được đánh giá cao!

+1

Kiểm tra câu trả lời này bởi một trong các nhà phát triển Meteor: http: // stackoverflow.com/questions/10115042/how-do-you-secure-the-client-side-mongodb-api/10116342 # 10116342 Nó cho thấy làm thế nào để vô hiệu hóa mặc định "bánh xe đào tạo" cho phép khách hàng và máy chủ để thực hiện các lệnh mongo tùy ý. Sau đó, bạn có thể chỉ hiển thị những gì bạn muốn cho máy khách thông qua Meteor.methods và Meteor.publish. Điều này sẽ được đơn giản hóa khi gói auteor Meteor được giải phóng. – rmarscher

Trả lời

6

Có vẻ như bạn đang cố gắng hạn chế khách hàng truy cập dữ liệu cho đến khi được xác thực. Dưới đây là một cách để làm điều đó:

Trước tiên, hãy viết hàm Meteor.publish trên máy chủ có tham số user_id. Hàm của bạn làm bất cứ điều gì bạn muốn trong môi trường máy chủ đặc quyền và cuối cùng trả về một con trỏ. Một ví dụ đơn giản sẽ là:

// 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}); 
}); 

Sau đó trên máy khách, đăng ký tập my-user một khi bạn có một user_id trong tay:

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

Bây giờ, bạn sẽ có một tài liệu Người dùng trên khách hàng nếu và chỉ khi user_id hợp lệ, như được xác định bởi chức năng đặc quyền của bạn someServerMethodThatValidatesUserId chạy trên máy chủ.

(this.set có sẵn bên trong chức năng xuất bản của bạn nếu bạn muốn quản lý thủ công các tài liệu cụ thể được gửi tới máy khách, thay vì dựa vào truy vấn Mongo. Nhưng tôi không nghĩ điều đó là cần thiết ở đây.)

+1

Có vẻ như điều đó sẽ tạo ra xung đột với các phần khác của mã khách hàng của tôi muốn truy cập vào toàn bộ bộ sưu tập Người dùng của tôi, phải không? – Samo

+0

điều này không phải là xấu, ngay cả khi người dùng quyết định thay đổi giá trị phiên của 'user_id' máy chủ sẽ xác thực anyway. – Adgezaza

Các vấn đề liên quan