使用HashID进行Spring Data Rest ID转换

时间:2018-06-25 06:55:51

标签: spring-data-rest hashids

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

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

是否有可能这样做,例如像ID转换SPI之类的东西?

2 个答案:

答案 0 :(得分:0)

我唯一能想到的就是创建一个请求过滤器,该过滤器将接受URL中带有编码ID的请求,然后对ID进行解码并重定向到具有解码ID的URL。

答案 1 :(得分:0)

您需要的是customizing item resource URIs在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];
    }
}

不幸的是,due to the bug(我想),PUT / PATCH-ing实体在Spring Boot 2+中不起作用,这与SB(1.5+)的先前版本不同,它可以按预期工作。

观看我的演示:sdr-hashids-demo