我们担心将内部 ID 暴露给外界。因此,我正在考虑使用散列机制(当前选择是 hashids)来散列我们的 ID。
我尝试在实体 ID 字段上使用 @JsonSerializer 和 @JsonDeserializer 映射。但这仅在正文中包含 ID 时生效,对 URL 路径中的 ID 没有影响。
是否有可能做到这一点,例如像 ID 翻译 SPI 之类的东西?
我们担心将内部 ID 暴露给外界。因此,我正在考虑使用散列机制(当前选择是 hashids)来散列我们的 ID。
我尝试在实体 ID 字段上使用 @JsonSerializer 和 @JsonDeserializer 映射。但这仅在正文中包含 ID 时生效,对 URL 路径中的 ID 没有影响。
是否有可能做到这一点,例如像 ID 翻译 SPI 之类的东西?
我唯一能想到的就是创建一个请求过滤器,它会在 URL 中接收带有编码 ID 的请求,然后解码 ID 并重定向到带有解码 ID 的 URL。
您需要通过自定义项目资源 URI在 Spring Data REST 中“开箱即用”工作:
@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];
}
}
不幸的是,由于这个错误(我想),PUT/PATCH-ing 实体在 Spring Boot 2+ 中不起作用,这与之前的 SB 版本(1.5+)不同,它可以按预期工作。
看我的演示:sdr-hashids-demo