Có một cách tiếp cận thực tiễn tốt nhất để quy tắc uỷ quyền thích hợp cho nội dung được bảo vệ trong một ứng dụng căn cứ hỏa lựcquy tắc uỷ quyền đúng cho nội dung được bảo vệ trong căn cứ hỏa lực
- sử dụng firepad đặc biệt
- Theo nội dung được bảo vệ tôi là nơi người dùng tạo tài liệu và chỉ chia sẻ tài liệu với một số người dùng khác).
- Ngoài ra tôi cần để có thể truy vấn căn cứ hỏa lực cho tất cả các tài liệu mà tôi có quyền truy cập vào (tài liệu mà tôi tạo ra và tài liệu người dùng khác chia sẻ với tôi)
Một số nghiên cứu của tôi cho đến nay:
Phương pháp 1: Bí mật URL
tôi cần phải biết địa chỉ URL để có thể xem/chỉnh sửa tài liệu
Không ủy quyền thực, vì mọi người dùng đã đăng nhập có quyền truy cập vào URL đó đều có thể chỉnh sửa/sửa đổi nó.
Cant chỉ mục tất cả các tài liệu tôi có quyền truy cập vào
Phương pháp 2: Sử dụng quy tắc uỷ quyền căn cứ hỏa lực để thêm người dùng đến một tài liệu và kiểm tra xem người dùng là document.users trước khi đọc/ghi.
Taken từ: Protected content in Firebase possible?
{
"documents": {
"$documents_id": {
// any friend can read my post
".read": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",
// any friend can edit my post
".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"
},
users:{
// List of user.ids that have access to this document
}
}
}
Ưu điểm:
- đúng phép/chứng thực. Chỉ những người dùng được xác thực đã được cấp quyền truy cập mới có thể xem/chỉnh sửa.
Nhược điểm:
- Không thể truy vấn cho tất cả các tài liệu một người dùng được phép chỉnh sửa (những người mà tôi sở hữu hoặc đã được chia sẻ với tôi) (? Là giả thiết này đúng)
Phương thức 3: Quy tắc cấp phép Firebase (phương pháp 2), cộng với một kho lưu trữ người dùng dự phòng có mảng tài liệu_ mỗi người dùng có quyền truy cập. Cửa hàng người dùng này sẽ chỉ được sử dụng để truy vấn tất cả tài liệu mà người dùng có quyền truy cập. ví dụ:
{
"documents": {
"$documents_id": {
// any friend can read my post
".read": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",
// any friend can edit my post
".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"
}
},
"users":{
"$user":{
".read": "auth.id=$user.id",
".write": "auth.id=$user.id"
"$documents":{
// All the documents i have access to. This list gets ammended whenever I am granted/stripped access to a document.
}
}
}
}
Ưu điểm:
- xác thực đúng/uỷ quyền
Nhược điểm: dữ liệu
- Duplicate, phải đối phó với vấn đề đồng bộ hóa giữa hai lưu trữ dữ liệu. Điều này dường như không giống như một ý tưởng hay.
Phương pháp 4: Nhóm
Sử dụng các nhóm mỗi Granting access to Firebase locations to a group of users
Chúng tôi có một nhóm cho mỗi tài liệu lưu trữ dữ liệu
Cant dễ dàng truy vấn căn cứ hỏa lực cho tất cả các tài liệu người dùng có thể truy cập
Có cách nào tốt hơn để thực hiện việc này không?
Cảm ơn michael cho làm rõ. Sẽ chỉ phải cẩn thận với việc giữ các bit quan trọng từ mỗi đồng bộ. – abaker
Vâng. Mặc dù trong nhiều trường hợp, bạn có thể dễ dàng làm cho mã của bạn mạnh mẽ chống lại sự không khớp. Ví dụ, nếu bạn có một tài liệu trong danh sách của bạn, nhưng bạn nhận được một sự cho phép bị từ chối lỗi khi bạn cố gắng đọc siêu dữ liệu của nó, chỉ cần ẩn nó khỏi người dùng. Bằng cách đó, các quy tắc bảo mật là True Authority và danh sách tài liệu cá nhân của bạn chỉ là một "gợi ý" về những gì bạn cần truy cập và nếu nó hơi bị mất đồng bộ, điều đó không quan trọng. Tất nhiên nếu bạn có thể đảm bảo chúng luôn đồng bộ, điều đó tốt hơn, nhưng không phải lúc nào cũng cần 100%. :-) –