Spring 使用 HashIDs 进行数据 Rest ID 转换

Spring Data Rest ID conversion using HashIDs

我们担心将内部 ID 暴露给外界。因此,我正在考虑使用哈希机制(当前选择是 hashids)来哈希我们的 ID。

我尝试在 Entities ID 字段上使用 @JsonSerializer 和 @JsonDeserializer 映射。但这仅在将ID包含在正文中时生效,对URL路径中的ID没有影响。

是否有可能做到这一点,例如类似于 ID 翻译 SPI?

我唯一能想到的是创建一个请求过滤器,它将在 URL 中接收带有编码 ID 的请求,然后解码 ID 并重定向到带有解码 ID 的 URL。

您需要的是 "right from the box" 在 Spring Data REST 中工作 customizing item resource URIs

@Configuration
public class RestConfigurer extends RepositoryRestConfigurerAdapter {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.withEntityLookup().forRepository(ModelRepo.class, model -> HashIdUtil.encode(model.getId()), ModelRepo::findByEncodedId);
        super.configureRepositoryRestConfiguration(config);
    }
}
public interface ModelRepo extends JpaRepository<Model, Long> {

    default Model findByEncodedId(String encodedId) {
        return getById(HashIdUtil.decode(encodedId));
    }

    Model getById(Long id);
}
public class HashIdUtil {

    private static final Hashids HASHIDS = new Hashids("salt", 8);

    public static String encode(Long source) {
        return HASHIDS.encode(source);
    }

    public static Long decode(String source) {
        return HASHIDS.decode(source)[0];
    }
}

不幸的是,due to the bug(我想),PUT/PATCH-ing 实体在 Spring Boot 2+ 中不起作用,不像以前的 SB (1.5+) 版本那样工作预期。

看我的演示:sdr-hashids-demo