处理多个用户 - Web SDK
Atlas Device SDK 已弃用。 有关详细信息,请参阅弃用页面。
Overview
Realm 软件开发工具包(Realm SDK)允许多个用户在给定浏览器上同时登录应用。 即使多个用户同时登录, Realm 客户端应用程序也会在单个活动用户的上下文中运行。 您可以在经过身份验证的用户之间快速切换,而无需他们再次登录。
重要
任何登录用户都可以成为活跃用户,无需重新认证。这可能是一个安全漏洞,具体取决于您的应用程序。例如,共享浏览器上的用户可以切换到同事的登录帐户,而无需提供他们的凭证或征求他们的明确许可。如果您的应用程序需要更严格的身份验证,请避免在用户之间切换,并且最好在对其他用户进行身份验证之前,显式注销活跃用户。
用户账户状态
当用户首次通过给定浏览器上的 Realm SDK 登录时,SDK 会保存用户的信息并跟踪用户的状态。 即使用户注销,他们的数据也会保留在本地存储中,除非您主动删除用户或清除浏览器中的数据。
以下状态描述了被跟踪用户在任何特定时间的状态:
经过身份验证:在浏览器上已登录且未注销或已撤销会话的任何用户。
已注销:在浏览器上经过身份验证但已注销或已撤销会话的任何用户。
下图展示了在特定事件发生时,Realm 客户端应用程序中的用户如何在各个状态之间进行转换:
为设备添加新用户
当用户首次登录浏览器时, Realm 软件开发工具包(Realm SDK)会自动将用户数据保存到浏览器的本地存储中。 用户登录后,将立即成为应用程序的活跃用户。
// Register Joe const joeEmail = "joe@example.com"; const joePassword = "passw0rd"; await app.emailPasswordAuth.registerUser({ email: joeEmail, password: joePassword, }); // Log in as Joe const joeCredentials = Realm.Credentials.emailPassword( joeEmail, joePassword ); const joe = await app.logIn(joeCredentials); // The active user is now Joe console.assert(joe.id === app.currentUser.id); // Register Emma const emmaEmail = "emma@example.com"; const emmaPassword = "passw0rd"; await app.emailPasswordAuth.registerUser({ email: emmaEmail, password: emmaPassword, }); // Log in as Emma const emmaCredentials = Realm.Credentials.emailPassword( emmaEmail, emmaPassword ); const emma = await app.logIn(emmaCredentials); // The active user is now Emma, but Joe is still logged in console.assert(emma.id === app.currentUser.id);
列出设备上的所有用户
您可以访问与浏览器关联的所有用户账户列表。该列表包含登录过客户端应用程序的所有用户,不论他们当前是否处于验证状态。
// Get an object with all Users, where the keys are the User IDs for (const userId in app.allUsers) { const user = app.allUsers[userId]; console.log( `User with id ${user.id} is ${ user.isLoggedIn ? "logged in" : "logged out" }` ); }
切换活跃用户
您可以随时将应用程序的活跃用户快速切换成其他登录用户。
// Get some logged-in users const authenticatedUsers = Object.values(app.allUsers).filter( (user) => user.isLoggedIn ); const user1 = authenticatedUsers[0]; const user2 = authenticatedUsers[1]; // Switch to user1 app.switchUser(user1); // The active user is now user1 console.assert(app.currentUser.id === user1.id); // Switch to user2 app.switchUser(user2); // The active user is now user2 console.assert(app.currentUser.id === user2.id);
从设备上删除用户
您可以从浏览器中删除用户的所有信息,并自动注销用户。
// Remove the current user from the device const user = app.currentUser; await app.removeUser(user); // The user is no longer the active user if (app.currentUser) { // The active user is now the logged in user (if there still is one) that was // most recently active console.assert(user.id !== app.currentUser.id); } // The user is no longer on the device console.assert( Object.values(app.allUsers).find(({ id }) => id === user.id) === undefined );