多用户应用程序 - Swift SDK
Atlas Device SDK 已弃用。 有关详细信息,请参阅弃用页面。
Realm Swift SDK允许多个用户在给定设备上同时登录应用。 即使多个用户同时登录,客户端应用程序也会在单个活动用户的上下文中运行。 您可以在经过身份验证的用户之间快速切换,而无需他们再次登录。
重要
任何登录用户都可以成为活动用户,而无需重新进行身份验证。 这可能是一个安全漏洞,具体取决于您的应用程序。 例如,共享设备上的用户可以切换到同事的登录帐户,而无需提供他们的凭证或征求他们的明确许可。 如果您的应用程序需要更严格的身份验证,请避免在用户之间切换,并且最好在对其他用户进行身份验证之前显式注销活动用户。
用户账户状态
当用户首次通过给定设备或浏览器上的Atlas App Services登录时, Realm 软件开发工具包(Realm SDK)会保存用户的信息并追踪用户在设备上的状态。 即使用户日志,其数据仍会保留在设备上,除非您主动删除用户。
以下状态描述了设备上的用户在任何给定时间的状态:
已通过身份验证:已登录设备且未注销或撤销会话的任何用户。
已注销:在设备上进行身份验证但已注销或已撤销会话的任何用户。
下图显示了当某些事件发生时,客户端应用程序中的用户如何在状态之间进行转换:
向设备添加新用户
当用户首次登录设备时,Realm SDK 会自动将用户添加到该设备。 用户登录后,将立即成为应用程序的活跃用户。
let app = App(id: YOUR_APP_SERVICES_APP_ID) let joeCredentials = Credentials.emailPassword(email: "joe@example.com", password: "passw0rd") app.login(credentials: joeCredentials) { (result) in switch result { case .failure(let error): print("Login failed: \(error.localizedDescription)") case .success(let joe): // The active user is now Joe assert(joe == app.currentUser) } } let emmaCredentials = Credentials.emailPassword(email: "emma@example.com", password: "pa55word") app.login(credentials: emmaCredentials) { (result) in switch result { case .failure(let error): print("Login failed: \(error.localizedDescription)") case .success(let emma): // The active user is now Joe assert(emma == app.currentUser) } }
列出设备上的所有用户
您可以访问权限设备上存储的所有用户帐户的列表。 此列表包括在给定设备上登录过该应用的所有用户,无论他们当前是否经过身份验证。
let app = App(id: YOUR_APP_SERVICES_APP_ID) let users = app.allUsers users.forEach({ (key, user) in print("User: \(key) \(user)") })
更改活动用户
您可以随时使用以下代码将应用的活跃用户更改为其他登录用户:
let app = App(id: YOUR_APP_SERVICES_APP_ID) // ... log in ... // Get another user on the device, for example with `app.allUsers` let secondUser: User = getSomeOtherUser() XCTAssertNotEqual(app.currentUser, secondUser) // assert(app.currentUser != secondUser) // Switch to another user // app.switch(to: secondUser) // The switch-to user becomes the app.currentUser // XCTAssertEqual(app.currentUser, secondUser) // assert(app.currentUser == secondUser)
从设备上删除用户
您可以从设备中删除有关用户的所有信息并自动注销用户。
app.currentUser?.logOut { (error) in // user is logged out or there was an error }