#6006·traccar

重新共享设备/组会重新使用临时用户,但永远不会更新其过期时间,导致所有后续的共享令牌都会以"用户已过期"为失败原因。

作者: xnetinho创建于 2026年8月30日更新于 2026年8月30日

在 `ShareResource.share()` 中,临时共享用户通过确定性的电子邮件 (`userEmail:uniqueId` 对于设备, `userEmail:group:<id>` 对于组) 被查找到。如果该用户已经存在(对同一对象的重新共享),则代码会跳过 `if (share == null)` 块,这意味着 `share.setExpirationTime(expiration)` 从来不会被调用对现有临时用户。 尽管令牌本身是通过正确的新过期时间生成的(`tokenManager.generateToken(share.getId(), expiration)`),但在 `LoginService.login(token)` 中的身份验证流程中,它会从数据库中检索用户并调用 `checkUserEnabled(user) -> checkDisabled()` 方法。该方法会直接从数据库记录中验证用户的 `expirationTime` (该记录仍保留着旧的过期日期),完全忽略令牌的有效性。 因此,一旦第一次共享过期,针对同一对象生成的每个后续共享令牌都会以 `SecurityException("User has expired")` (HTTP 401) 失败。

内容来源: traccar/traccar