如何配置ObjectBox Sync数据过滤实现用户专属数据同步?
ObjectBox Sync 用户专属数据过滤配置方案
要实现每个用户仅能在其设备上同步自身专属数据,核心是通过数据标识+同步过滤规则+用户认证的组合方案,具体步骤如下:
1. 数据模型添加用户归属标识
给所有需要同步的实体类新增一个userId字段,用来标记数据所属的用户,确保该字段被ObjectBox持久化:
@Entity data class Task( @Id var id: Long = 0, var title: String = "", var isCompleted: Boolean = false, var userId: String = "" // 核心:标记数据归属用户 )
2. Sync Server 端配置过滤规则
ObjectBox Sync Server支持基于客户端身份的订阅过滤器,确保每个客户端仅能同步匹配自身用户ID的数据:
代码方式配置(以Java为例)
在服务器端处理客户端连接时,从认证信息中提取用户ID,为该连接设置实体过滤规则:
syncServer.addConnectionListener(new SyncConnectionListener() { @Override public void onConnected(SyncConnection connection) { // 从客户端认证令牌中解析出用户ID(比如JWT解析) String userId = parseUserIdFromAuthToken(connection.getAuthToken()); // 为Task实体设置过滤:仅同步userId匹配的数据 connection.setSubscriptionFilter( Task.class, QueryBuilder.equal(Task_.userId, userId) ); // 对其他需要同步的实体重复设置过滤规则 } });
配置文件方式(JSON)
若使用Sync Server的配置文件启动,可通过变量绑定实现动态过滤,@userId为认证后提取的用户变量:
{ "subscriptions": [ { "entity": "Task", "query": "userId == @userId" }, { "entity": "Note", "query": "userId == @userId" } ] }
3. 客户端配合认证与本地过滤
客户端连接Sync Server时,必须携带可靠的用户认证信息(比如JWT令牌),同时本地查询也需过滤当前用户数据,确保一致性:
// 携带用户认证信息连接Sync Server val syncCredentials = SyncCredentials.jwt("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...") // 包含user_A的ID val syncClient = Sync.client(boxStore, "ws://your-sync-server:9999", syncCredentials) // 本地查询仅获取当前用户的数据 val userTasks = boxStore.boxFor(Task::class.java) .query() .equal(Task_.userId, "user_A") .build() .find()
4. 关键注意事项
- 认证必须安全:采用JWT/OAuth2等可靠认证方式,确保Sync Server能准确识别用户身份,避免越权访问。
- 实体全覆盖:所有需要同步的实体都要添加
userId字段并配置对应过滤规则,防止遗漏数据导致泄露。 - 初始同步优化:首次同步时过滤器直接生效,客户端只会拉取符合自身用户ID的数据,无需全量同步。
- 实时同步触发:数据更新时,仅符合当前客户端过滤条件的变更会被推送,无效变更不会占用带宽。
内容的提问来源于stack exchange,提问作者user966020
相关产品推荐
相关产品推荐

