[英]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 应用程序中实施各种访问控制策略的能力,包括基于角色的访问控制。 这些自定义属性可以为用户提供不同级别的访问权限(角色),这些权限在应用程序的安全规则中强制执行。
一旦您为您的用户分配了与其用户角色相对应的自定义声明(例如商家或客户声明),您将能够:
更准确地说,如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.