Ограничение страниц определенным пользователем типа Nuxt и Firebase Firestore (авторизация на основе ролей)

# #javascript #firebase #google-cloud-firestore #nuxt.js #middleware

Вопрос:

здесь нужен совет.

В моем веб-приложении Nuxt amp; Firebase / Firestore будет 3 разных типа пользователей:

  1. субподрядчик
  2. подрядчик
  3. рабочий

Во-первых, я хочу, чтобы мои пользователи при каждом входе в систему заходили на страницу, связанную с их типом пользователя. например: запрос входа субподрядчика в / subjector, запрос входа подрядчика в / contractor и т. Д. И т. Д.

Я также хочу, чтобы пользователь мог видеть только страницы, связанные с их типами. (пользователь A видит только / A amp; / Atwo, пользователь B может видеть только /B amp; / Btwo, пользователь C может видеть только / C amp; / Ctwo и т. Д. И т. Д.)

Я хочу избегать использования облачных функций, если могу, насколько я понимаю, вы не можете развернуть свое приложение в бесплатном плане, если в вашем приложении есть облачные функции.

В любом случае, ниже правильный способ сделать это?

  1. Создайте в firestore документ пользователей, содержащий сведения о типе пользователя, например: «Тип пользователя: субподрядчик»
  2. В промежуточном программном обеспечении выполните логику, основанную на типе пользователя. (в моем случае мне нужно иметь 3 разных файла промежуточного программного обеспечения js (isSubcontractor.js , isContractor.js , isWorker.js )
  3. добавить промежуточное программное обеспечение: «файл промежуточного программного обеспечения» внутри моей страницы

Если это правильно, как выполнить шаги 1 и 2? Есть ли какие-либо статьи или исходный код реального приложения, которые кратко объясняют, что я хотел?

Новичок здесь. Уже прошел здесь и там по всему Интернету, но не могу найти ответ, который я хотел: (

Ответ №1:

Пользовательские утверждения, безусловно, являются опцией, но для этого потребуются облачные функции или сервер. Да, вы можете сохранить тип пользователя в их документе Firestore и проверять его перед отображением страницы или при необходимости. Однако вы должны убедиться, что только авторизованные пользователи могут изменять свою роль.

Поток будет таким же простым, как:

  1. Пользователь входит в систему
  2. Чтение их роли из документа Firestore
  3. Перенаправление на соответствующую страницу
 import { getAuth, signInWithEmailAndPassword } from "firebase/auth";
import { getFirestore, doc, getDoc } from "firebase/firestore";

const auth = getAuth();
const firestore = getFirestore();

const login = async () => {
  const { user } = await signInWithEmailAndPassword(auth, email, password);
  
  // Reading user document
  const docRef = doc(firestore, "users", user.uid);
  const docSnap = await getDoc(docRef);

  const { userType } = docSnap.data()
  switch (userType) {
    case 'contractor': 
      // redirect to /contractor
      break;

    case 'sub-contractor': 
      // redirect to /sub-contractor
      break;

    default: 
      // redirect to default page
      break;
  }
}
 

Я также хочу, чтобы пользователь мог видеть только страницы, связанные с их типами.

Вы можете использовать тот же метод в промежуточном программном обеспечении на стороне сервера. Сначала прочитайте UserType, а затем проверьте, авторизован ли пользователь для посещения страницы. Если нет, перенаправьте на любую другую страницу.

Лучшая часть использования пользовательских утверждений заключается в том, что вы также можете прочитать их в правилах безопасности базы данных реального времени, Firestore и хранилища. Если вы сохраняете тип пользователя в Firestore, вы не можете прочитать это в правилах безопасности любой другой службы Firebase. Использование Firestore также влечет за собой дополнительную плату за чтение роли пользователя каждый раз. Вам нужна облачная функция, чтобы устанавливать только пользовательское утверждение, а не читать утверждение каждый раз.