托管多用户应用程序 - Kotlin SDK
本页介绍如何使用 Kotlin SDK 在单个设备中托管多个 Atlas App Services 用户。要了解如何对用户进行身份验证并使其登录客户端应用程序,请参阅创建和身份验证用户 - Kotlin SDK。
Realm 允许多个用户在给定设备上同时登录应用。 即使多个用户同时登录,Realm 客户端应用程序也会在单个活动用户的上下文中运行。 一次只能有一个活动用户,并且该活动用户与所有传出请求相关联。
用户账户
用户帐户代表应用程序的单个不同用户。 当用户首次成功进行身份验证并登录设备上的应用时, App Services会创建关联的唯一 User
对象。 登录,SDK 会保存用户信息并追踪用户在设备上的状态。 即使用户注销,此数据仍会保留在设备上,除非您主动从设备删除用户。 有关App Services用户和用户帐户的详细信息,请参阅App Services文档中的用户帐户。
用户状态
用户在给定设备上的可能状态在Kotlin SDK中由user.state枚举表示。 用户帐户可以是LOGGED_OUT
、 LOGGED_IN
或REMOVED
。 下面描述了这些状态在任何给定时间如何与设备上的用户相对应:
已登录:已登录设备且未注销或已撤销会话的任何经过身份验证的用户。
user.state
为LOGGED_IN
。 登录用户可以是:Active :当前正在给定设备上使用该应用程序的单个经过身份验证的用户。 SDK 会将此用户与传出请求相关联,Atlas App Services 会评估数据访问权限并在此用户的上下文中运行函数。
非活跃:所有经过身份验证但不是当前活跃用户的用户。
已注销:在设备上进行身份验证但已注销或会话已撤销的任何用户。
user.state
为LOGGED_OUT
。已删除:已从设备中主动删除的任何用户。 SDK 会将用户从应用程序中注销,并从设备中删除有关用户的所有信息。 用户必须重新进行身份验证才能再次使用该应用。
user.state
为REMOVED
。
向设备添加新用户
当用户首次登录设备时,Realm 软件开发工具包(Realm SDK)会自动将用户添加到该设备。用户成功登录后,将立即成为应用程序的活跃用户。
在以下示例中,Joe 登录应用并成为活跃用户。 然后,Emma 登录并取代 Joe 作为活动用户:
val app = App.create(YOUR_APP_ID) // Replace with your App ID runBlocking { // Log in as Joe val joeCredentials = Credentials.emailPassword(joeEmail, joePassword) try { val joe = app.login(joeCredentials) // The active user is now Joe val user = app.currentUser Log.v("Successfully logged in. User state: ${joe.state}. Current user is now: ${user?.id}") assertEquals(joe, user) } catch (e: Exception) { Log.e("Failed to log in: ${e.message}") } // Log in as Emma val emmaCredentials = Credentials.emailPassword(emmaEmail, emmaPassword) try { val emma = app.login(emmaCredentials) // The active user is now Emma val user = app.currentUser Log.v("Successfully logged in. User state: ${emma.state}. Current user is now: ${user?.id}") assertEquals(emma, user) } catch (e: Exception) { Log.e("Failed to log in: ${e.message}") } }
Successfully logged in. User state: LOGGED_IN. Current user is now: 65133e130075a51f12a9e635 Successfully logged in. User state: LOGGED_IN. Current user is now: 65133e1357aaf22529343c1b
检索活动用户
您可以使用App.currentUser检索当前活跃用户。 如果多个用户登录,则会返回最后登录设备的有效用户。 如果没有登录用户,此方法将返回null
。
val user = app.currentUser
有关详细信息,请参阅检索当前用户。
列出设备上的所有用户
您可以使用app.allUsers()方法访问存储在设备上的所有已知用户帐户的映射。 此方法返回在给定设备上登录过客户端应用程序的所有用户,无论他们当前是否经过身份验证( user.state
为LOGGED_IN
或LOGGED_OUT
)。
在以下示例中,SDK 返回 Emma 和 Joe 的user.id:
// Get all known users on device val allUsers = app.allUsers() for ((key) in allUsers) { Log.v("User on Device $device: $key") }
User on Device 651330cebe1d42b24b8d510f: 65133e1357aaf22529343c1b User on Device 651330cebe1d42b24b8d510f: 65133e130075a51f12a9e635
注销用户
您可以使用user.logOut()将已登录用户从应用程序中注销 方法。 注销后,用户仍会存储在设备上,但必须重新登录才能使用该应用。
在以下示例中,Joe 当前以当前用户身份登录。 从应用程序注销 Joe 后,我们确认他仍以用户身份存储在设备上,并且 Emma 现在是当前用户:
try { joe.logOut() Log.v("Successfully logged out user. User state: ${joe.state}. Current user is now: ${app.currentUser?.id}") } catch (e: Exception) { Log.e("Failed to log out: ${e.message}") } val joeIsAUser = app.allUsers().containsKey(joe.id) assertTrue(joeIsAUser)
Successfully logged out user. User state: LOGGED_OUT. Current user is now: 65133e1357aaf22529343c1b
有关用户登录和退出应用的更多信息,请参阅创建和验证用户 - Kotlin SDK。
从设备上删除用户
您可以使用user.remove()从设备中主动删除用户以及有关该用户的所有信息。 删除后,用户必须重新进行身份验证才能再次使用该应用。 这不会从 App Services App 中删除User
对象。
在以下示例中,Emma 是设备上当前(也是唯一)登录的用户。 删除 Emma 后,我们确认 Emma 已从设备中删除,并且没有当前用户,因为 Joe 仍处于注销状态:
assertEquals(emma, app.currentUser) try { emma.remove() Log.v("Successfully removed user. User state: ${emma.state}. Current user is now: ${app.currentUser?.id}") } catch (e: Exception) { Log.e("Failed to remove user: ${e.message}") } val emmaIsAUser = app.allUsers().containsKey(emma.id) assertFalse(emmaIsAUser)
Successfully removed user. User state: REMOVED. Current user is now: null
有关移除和删除用户的更多信息,请参阅删除用户。