Как я могу использовать Cloud Firestore для хранения личных пользовательских данных, которые только они могут читать, записывать и удалять?

#firebase #google-cloud-firestore #firebase-authentication #swiftui #firebase-security

#firebase #google-cloud-firestore #firebase-аутентификация #swiftui #firebase-безопасность

Вопрос:

Еще немного контекста…

Я создаю приложение с помощью Swiftui. Пользователь может войти в систему или зарегистрироваться (кажется, работает!), А затем, войдя в систему, заполнить форму с помощью средства выбора даты и текстовых полей. Эти данные успешно загружаются в firebase в документе, а затем отображаются в списке в приложении. Независимо от того, какой пользователь подписан, в списке отображаются одни и те же данные. Чего я хотел бы достичь:

Только подписанный пользователь может видеть данные, которые он добавил в свой список. Только подписанный пользователь может читать, записывать и удалять эти данные.

Очень новичок в программировании, заранее спасибо за любую доступную помощь.

 import SwiftUI
import Firebase
import Combine

class SessionStore: ObservableObject {
    var didChange = PassthroughSubject<SessionStore, Never>()
    @Published var session: User? {didSet{self.didChange.send(self) }}
    var handle: AuthStateDidChangeListenerHandle?
    
    func listen() {
        handle = Auth.auth().addStateDidChangeListener({ (auth, user) in
            if let user = user {
                self.session = User(uid: user.uid, email: user.email)
            }
            else {
                self.session = nil
            }
        })
        
    }
    
    
    func signUp(email: String, password: String, handler: @escaping AuthDataResultCallback) {
        Auth.auth().createUser(withEmail: email, password: password, completion: handler)
    }
    
    func signIn(email: String, password: String, handler: @escaping AuthDataResultCallback) {
        Auth.auth().signIn(withEmail: email, password: password, completion: handler)
        
    }
    
    func signOut() {
        do {
            try Auth.auth().signOut()
            self.session = nil
        }catch {
            print("error signing out")
        }
        
    }
    
    func unbind() {
        if let handle = handle {
            Auth.auth().removeStateDidChangeListener(handle)
        }
    }
    
    deinit {
        unbind()
        
    }
}

struct User {
    var uid: String
    var email: String?
    
    init(uid: String, email: String?) {
        self.uid = uid
        self.email = email
    }
}

  

Ответ №1:

Поскольку у вас уже работает логин, вы должны иметь доступ к идентификатору пользователя (UID) и использовать его от пользователя ( user.uid ) в качестве идентификатора вместе с данными, которые вы сохраняете. Ознакомьтесь с этой статьей о firestore и сохранении пользовательских данных для получения дополнительной информации о том, как это выглядит!

Комментарии:

1. Спасибо за помощь, я обновил свой вопрос, чтобы показать SessionStore, который прослушивает текущего пользователя. Я изо всех сил пытаюсь сохранить user.uid из этого представления как часть моих данных в документе Firebase. Нужно ли добавлять в мою функцию прослушивания?

Ответ №2:

Вы можете использовать правило безопасности в своей Firebase. Есть несколько способов сделать это, например, вы можете сохранить UID аутентифицированного пользователя при его регистрации в данных вашего документа, а затем вы можете проверить, соответствует ли он uid запроса:

Пример Firestore

 rules_version = '2';
 service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid == resource.data.uid;
    }
  }
}
  

Вы также можете использовать идентификатор документа в качестве идентификатора пользователя и проверить, соответствует ли он.