TL;DR
- react-admin-firebase 使った時、firestore.rules と permanent filter を合わせる書き方
dataProvider
import { initializeApp } from "firebase/app";
import { FirebaseAuthProvider, FirebaseDataProvider, RAFirebaseOptions } from "react-admin-firebase";
const firebaseConfig = { ... };
const app = initializeApp(firebaseConfig);
const options: RAFirebaseOptions = {
disableMeta: false,
renameMetaFields: {
created_at: "created_at",
created_by: "created_by",
updated_at: "updated_at",
updated_by: "updated_by",
},
dontAddIdFieldToDoc: false,
associateUsersById: false,
};
const authProvider = FirebaseAuthProvider(firebaseConfig, options);
const dataProvider = FirebaseDataProvider(firebaseConfig, options);
list
import firebase from "firebase/compat/app";
import { ResourceComponentProps } from "react-admin";
type CollectionReference = firebase.firestore.CollectionReference;
const list = (props: ResourceComponentProps) => (
<List {...props}
filter={{
collectionQuery: (cr: CollectionReference) =>
cr.where("created_by", "==", props.permissions.user_id),
}}
>
<Datagrid>
...
</Datagrid>
</List>
);
firestore
firestore.rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /posts/{post} {
allow get: if request.auth != null;
allow list: if request.auth != null && resource.data.created_by == request.auth.uid;
}
}
}
参考
https://github.com/benwinding/react-admin-firebase/pull/39