JHipster7升级后如何用Elasticsearch用户过滤保护端点
JHipster v5升级v7.9.3:Elasticsearch权限过滤适配方案
问题背景
将JHipster v5应用升级至v7.9.3后,原有的Elasticsearch搜索权限控制逻辑无法直接复用:
- JHipster 5中
BloodPressureSearchRepository的search()方法支持直接传入BoolQueryBuilder,可在查询中添加用户登录过滤条件 - JHipster 7中该方法仅接受String类型参数,但已构建好带用户过滤逻辑的
BoolQueryBuilder,需要适配新的Repository方法实现权限控制
解决方案
观察BloodPressureSearchRepositoryInternal接口,发现存在search(Query query)重载方法,可通过NativeSearchQueryBuilder将自定义的BoolQueryBuilder封装为NativeSearchQuery,再调用该方法完成搜索。
修改Controller代码
替换原有的search(query, pageable)调用逻辑,改为使用自定义queryBuilder构建查询:
public ResponseEntity<List<BloodPressure>> searchBloodPressures( @RequestParam String query, @org.springdoc.api.annotations.ParameterObject Pageable pageable ) { log.debug("REST request to search for a page of BloodPressures for query {}", query); BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery().must(queryStringQuery(query)); if (SecurityUtils.isAuthenticated() && !SecurityUtils.hasCurrentUserThisAuthority(AuthoritiesConstants.ADMIN)) { queryBuilder = queryBuilder.filter(matchQuery("user.login", SecurityUtils.getCurrentUserLogin().orElse(""))); } // 用NativeSearchQueryBuilder封装自定义queryBuilder并设置分页 NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(queryBuilder) .withPageable(pageable) .build(); // 调用支持Query参数的search方法 Page<BloodPressure> page = bloodPressureSearchRepository.search(nativeSearchQuery); HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page); return ResponseEntity.ok().headers(headers).body(page.getContent()); }
说明
- 利用
NativeSearchQueryBuilder将已构建好的BoolQueryBuilder(包含用户过滤逻辑)转换为Spring Data Elasticsearch支持的NativeSearchQuery - 通过
withPageable(pageable)保留原有的分页参数 - 调用Repository中
search(Query query)方法执行查询,实现与JHipster 5相同的权限控制效果
内容的提问来源于stack exchange,提问作者Matt Raible
相关产品推荐
相关产品推荐

