0

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

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

是否有可能做到这一点,例如像 ID 翻译 SPI 之类的东西?

4

2 回答 2

0

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

于 2018-06-25T07:07:02.713 回答
0

您需要通过自定义项目资源 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

于 2018-06-25T16:31:42.193 回答