reactjs - 使用 React、Redux 和 Firebase 登录时检查用户自定义声明(是管理员)
问题描述
我想知道是否有人可以帮助我。
我目前正在构建一个管理仪表板,只能由管理员访问。我正在使用 React、Redux 和 Firebase。
我已经设法在云功能中为特定用户设置自定义声明,如下所示:
exports.addSuperAdminRole = functions.https.onCall((data, context) => {
return admin.auth().getUserByEmail(data.email).then(user => {
return admin.auth().setCustomUserClaims(user.uid, {
superAdmin: true
})
}).then(() => {
return {
message: `Success! ${data.email} has been made an admin.`
}
}).catch(err => {
return err;
});
});
我现在只想限制超级管理员对仪表板的访问,并且想知道什么是最好的(最安全的)方法来做到这一点。
目前,我有以下客户端登录操作,我在其中检查自定义声明,如果用户不是管理员,则只需注销用户:
export const login = creds => {
return async (dispatch, getState, { getFirebase }) => {
const firebase = getFirebase();
try {
await firebase
.auth()
.signInWithEmailAndPassword(creds.email, creds.password);
const currentUser = firebase.auth().currentUser;
currentUser.getIdTokenResult().then(idTokenResult => {
console.log(currentUser);
currentUser.superAdmin = idTokenResult.claims.superAdmin;
if (!currentUser.superAdmin) {
console.log('is not admin');
firebase.logout();
}
});
} catch (error) {
console.log(error);
throw new SubmissionError({
_error: 'Login failed'
});
}
};
};
这是否足够,还是我需要在登录时运行云功能,检查声明,然后注销用户?如果是这样,将如何做到这一点?
您能给我的任何帮助将不胜感激!
干杯,
詹姆士
解决方案
import firebase from 'firebase/app'; // this works with npm install firebase
firebase.auth().currentUser.getIdTokenResult()
.then((idTokenResult) => {
// Confirm the user is an Admin.
if (!!idTokenResult.claims.admin) {
// Show admin UI.
showAdminUI();
} else {
// Show regular user UI.
showRegularUI();
}
})
.catch((error) => {
console.log(error);
});
资源:https ://firebase.google.com/docs/auth/admin/custom-claims
推荐阅读
- json - 来自 json 的 Object.entries 用 svelte 读出
- reactjs - 反应(JEST)测试
- python - 如何在 python-docx 中创建 TextBox?
- ruby-on-rails-5 - 如何在 Rails 视图中使用索引
- html - scroll-snap-type 可以做什么
- reactjs - React-select 默认值没有被 React-i18next 翻译
- hive - 使用 Nifi 调度批量数据插入 Hive
- vba - 如何只自动回复抄送?
- r - MarrangeGrob/ggsave:如何添加带有文本的页面并在页面上组织绘图
- android - 使用 recyclerview 在 Fragment 中滑动错误