2017-01-25 22 views
12

Tôi có hai mô hình Ember: itemscomments. Người dùng sẽ đăng một mục và những người dùng khác sẽ có thể nhận xét về các mục.Quy tắc bảo mật Firebase Emberfire Nhiều cấp truy cập trên mỗi nút

tôi không thể quy tắc an ninh thiết lập trong căn cứ hỏa lực cho phép namedescription được ghi bởi chỉ có người dùng hiện tại, nhưng cho phép comments để được ghi vào bởi bất kỳ người dùng đăng nhập.

mục

// app/models/item.js 
export default DS.Model.extend({ 
    name: DS.attr('string'), 
    description: DS.attr('string'), 
    comments: DS.hasMany('comment'), 
    user: DS.belongsTo('user') 
}) 

Comment

// app/models/comment.js 
export default DS.Model.extend({ 
    user: DS.belongsTo('user') 
    body: DS.attr('string'), 
    timestamp: DS.attr('string'), 
    item: DS.belongsTo('user') 
}) 

Tiết kiệm một lời nhận xét

// app/components/comment-form.js 
const comment = this.get('comment'); 
const item = this.get('item'); 
// service that tracks the currently logged in user 
const currentUser = this.get('sessionManager.user'); 
comment.set('timestamp', new Date()); 
comment.set('user', currentUser); 

// setup both sides of the relationship 
item.get('comments').pushObject(comment); 
comment.set('item', item'); 

// save both 
return Ember.RSVP.Promise.all([item.save(), user.save()]); 

Tất cả điều này hoạt động tốt. Hôm nay, tôi đã thêm các quy tắc bảo mật trong firebase. Tôi chỉ muốn người dùng hiện đã đăng nhập có thể chỉnh sửa một mục, nhưng cho phép bất kỳ người dùng nào khác thêm nhận xét vào bất kỳ mục nào.

"items": { 
    ".read": "auth !== null", 
    "$item_id": { 
     // only the currently logged in user can write to this node 
     ".write": "root.child('users/'+data.child('user').val()+'/uid').val() === auth.uid", 
     // allow any user to write comments 
     "comments": { 
      ".write": "auth !== null" 
     } 
    } 
}, 

Trong trình mô phỏng Firebase, công cụ này hoạt động. Là người sở hữu mục tôi có thể viết cho /items/<item_id>/description. Là người dùng không sở hữu mục, tôi có thể viết thư cho /items/<item_id>/comments/, nhưng không thể ghi số /items/<item_it>/description. Tuy nhiên nó không thành công trong Ember khi sử dụng Emberfire.

Lý thuyết làm việc của tôi là khi tôi thêm nhận xét mới vào một mục tôi không "sở hữu", sau đó tôi gọi item.save() Emberfire cố gắng viết thư cho /items/<item_id>.

Làm thế nào tôi có thể thiết lập quy tắc căn cứ hỏa lực an ninh như vậy mà chỉ có người dùng sở hữu item có thể cập nhật nhất của thuộc tính của nó, nhưng bất kỳ người sử dụng có thể thêm một comment

Đây là là trong các quy tắc mô phỏng căn cứ hỏa lực:

Cố gắng để viết thư cho /items/<item_id>/comments với một người dùng mà không sở hữu mục mặt hàng này, với các dữ liệu

{ 
    "cde": "comment_id" 
} 

sẽ successf ully viết với các quy tắc trên.

Tuy nhiên,

Cố gắng để viết thư cho /items/<item_id> với một người dùng mà không sở hữu mục mặt hàng này, với các dữ liệu

{ 
    "comments": { 
     "cde": "comment_id" 
    } 
} 

thất bại.

Trả lời

1

Vấn đề là trong quy tắc .write bạn đã sử dụng datapredefined variabledata đề cập đến:

Một RuleDataSnapshot đại diện cho dữ liệu vì nó tồn tại trước hoạt động cố gắng.

Đối với các mặt hàng mới, data.exists() sẽ là false. Để cho phép người dùng viết các mặt hàng mới, bạn nên sử dụng newData, thay vì:

".write": "root.child('users/' + newData.child('user').val() + '/uid').val() === auth.uid" 

Và, nếu bạn muốn cho phép xóa các mặt hàng, bạn nên kiểm tra sự tồn tại của newData và sử dụng data nếu nó không tồn tại:

".write": "root.child('users/' + (newData.exists() ? newData.child('user').val() : data.child('user').val()) + '/uid').val() === auth.uid" 
+0

Đó là một điểm tốt trên dữ liệu mới, nhưng nó không giải quyết được vấn đề của tôi. Tôi đã cập nhật bài đăng gốc với nhiều thông tin hơn từ trình mô phỏng firebase. Tôi nghĩ rằng điều này chứng minh rằng Emberfire ghi vào/các mục khi tôi cố gắng lưu một bình luận. –

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