繁体   English   中英

如何区分经过身份验证的用户?

[英]How can I differentiate between authenticated users?

我正在构建一个同时拥有商家和客户的应用程序。 商家提供他们的服务,客户可以从商家那里预订服务。

它们都通过 Firebase 进行了身份验证,并且在您可以在 Firebase 控制台上找到的身份验证列表中。

注册时,商家的信息 go 会出现在名为“businesses”的集合中。 客户 go 在名为“用户”的集合上。

这就是我创建“用户”文档的方式

async createUserProfileDocument(user, additionalData) {
    if (!user) return
    const userRef = this.firestore.doc(`users/${user.uid}`)
    const snapshot = await userRef.get()
    if (!snapshot.exists) {
      const { displayName, email, photoURL, providerData } = user
      const createdAt = moment().format('MMMM Do YYYY, h:mm:ss a')
      try {
        await userRef.set({
          displayName,
          email,
          photoURL,
          createdAt,
          providerData: providerData[0].providerId, //provider: 'google.com', 'password'
          ...additionalData,
        })
      } catch (error) {
        console.error('error creating user: ', error)
      }
    }
    return this.getUserDocument(user.uid)
  }

  async getUserDocument(uid) {
    if (!uid) return null
    try {
      const userDocument = await this.firestore.collection('users').doc(uid).get()
      return { uid, ...userDocument.data() }
    } catch (error) {
      console.error('error getting user document: ', error)
    }
  }

这就是“用户”注册的方式

export const Register = () => {
  const history = useHistory()

  async function writeToFirebase(email, password, values) { //function is called below
    try {
      const { user } = await firebaseService.auth.createUserWithEmailAndPassword(email, password)
      firebaseService.createUserProfileDocument(user, values)
    } catch (error) {
      console.error('error: ', error)
    }
  }

  //Formik's onSubmit to submit a form
  function onSubmit(values, { setSubmitting }) {
    values.displayName = values.user.name
    writeToFirebase(values.user.email, values.user.password, values) //function call
  }

这就是“商人”的注册方式。 他们使用 email + 密码和他们的信息从表格 go 注册到名为“企业”的集合

firebaseService.auth.createUserWithEmailAndPassword(values.user.email, values.user.password)
await firebaseService.firestore.collection('businesses').add(values) //values from a form

这是我希望能够区分“用户”和“商家”的地方,以便我可以使用“商家”数据编写一些逻辑。 到目前为止,它只适用于“用户”

useEffect(() => {
    firebaseService.auth.onAuthStateChanged(async function (userAuth) {
      if (userAuth) {
         //**how can I find out if this userAuth is a 'merchant' (business) or 'user' (client)
        const user = await firebaseService.createUserProfileDocument(userAuth)
        setUsername(user.displayName)
        //if (userAuth IS A MERCHANT) setUserIsMerchant(true)   **what I'd like to be able to do
      } else {
        console.log('no one signed in')
      }
    })
  }, [])

实施基于角色的访问控制系统的推荐方法是使用自定义声明

您将结合自定义声明(和 Firebase 身份验证)与Firebase 安全规则 如上述文档中所述:

Firebase Admin SDK 支持在用户帐户上定义自定义属性。 这提供了在 Firebase 应用程序中实施各种访问控制策略的能力,包括基于角色的访问控制 这些自定义属性可以为用户提供不同级别的访问权限(角色),这些权限在应用程序的安全规则中强制执行

一旦您为您的用户分配了与其用户角色相对应的自定义声明(例如商家或客户声明),您将能够:

  1. 根据声明调整您的安全规则;
  2. 在您的前端获取声明并采取相应的行动(例如,路由到特定的应用程序屏幕/页面,显示特定的 UI 元素等...)

更准确地说,如doc中所述,您可以执行以下操作:

useEffect(() => {
    firebaseService.auth.onAuthStateChanged(userAuth => {
      if (userAuth) {

         userAuth.getIdTokenResult()
         .then((idTokenResult) => {
             // Confirm the user is a Merchant or a Client
             if (!!idTokenResult.claims.merchant) {
                 // Do what needs to be done for merchants
             } else if (!!idTokenResult.claims.client) {
                 // Do what needs to be done for clients
             }
      } else {
        console.log('no one signed in')
      }
    })
  }, [])

您可能会对这篇介绍“如何创建用于管理用户访问和角色的管理模块”的文章感兴趣(免责声明,我是作者)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM