#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 запроса:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid == resource.data.uid;
}
}
}
Вы также можете использовать идентификатор документа в качестве идентификатора пользователя и проверить, соответствует ли он.